Android MVVM-数据更改时更新ViewModel

时间:2019-03-23 17:47:39

标签: android mvvm kotlin rx-java

我正在使用将MVVM模式与RxJava一起使用的应用程序。架构如下: enter image description here

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

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

问题在于两个Activity具有两个不同的ViewModel。我如何使第二个Activity所做的更改影响第一个ViewModelRepository负责将更改通知第一Activity吗?

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

非常感谢!

1 个答案:

答案 0 :(得分:3)

  

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

问题在于两个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);
}

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

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

您进入了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;
    }
}

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