Android MVVM-数据更改时更新ViewModel

Cil*_*lla 1 android mvvm kotlin rx-java

我正在使用MVVM带有模式的应用程序RxJava。架构如下: 在此处输入图片说明

这是我第一次使用此模式,并且我不确定在由应用程序的另一个组件进行的数据更改中更新ViewModel(因此相应的View)的最佳方法。

例如:假设我们有一个Activity显示我关注的用户列表(如社交应用程序),则从该列表中选择一个用户,然后在另一个用户中打开其个人资料Activity。现在,从第二秒开始,Activity我决定取消关注该用户,当我按下后退按钮返回到第一秒时,我Activity希望列表自动更新(删除相应的用户,显然无需重新下载所有数据)。

问题在于两者Activity有两个不同ViewModel。我如何使第二个所做的更改Activity影响ViewModel第一个所做的更改?Repository通知第一个Activity更改是否是的责任?

  • 我宁愿不使用 startActivityForResult
  • 我宁愿不注入ViewModel第一Activity在第二个

非常感谢!

Epi*_*rce 6

我决定取消关注该用户,当我按下“后退”按钮返回第一个活动时,我希望列表自动更新(删除相应的用户,显然无需重新下载所有数据)。

问题是两个Activity有两个不同的ViewModel。

我以为您有一个存储库,其中包含可以公开的“模型”(本地数据源)LiveData<*>,不是吗?

在这种情况下,您需要做的是:

@Dao
public interface ItemDao {
    @Query("SELECT * FROM ITEMS")
    LiveData<List<Item>> getItemsWithChanges();

    @Query("SELECT * FROM ITEMS WHERE ID = :id")
    LiveData<List<Item>> getItemWithChanges(String id);
}
Run Code Online (Sandbox Code Playgroud)

现在,您的存储库可以从DAO返回LiveData:

public class MyRepository {
    public LiveData<List<Item>> getItems() {
        // either handle "fetch if needed" here, or with NetworkBoundResource
        return itemDao.getItemsWithChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

您在ViewModel中得到的:

public class MyViewModel extends ViewModel {
    private final LiveData<List<Item>> items;

    public MyViewModel(MyRepository repository) {
        this.items = repository.getItems();
    }

    public LiveData<List<Item>> getItems() {
        return items;
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,如果您观察到此情况,则在修改“房间”中的项目时,它将自动更新其中的LiveData onStart(当您再次开始观察时)。