具有多个ViewModel的Activity

38

我有一个包含3个RecyclerViewsActivity。我需要使用来自远程存储库的数据填充这些RecyclerViews(3个不同的请求)。我可以在Activity中使用多个ViewModels,还是有更好的解决方案(最佳实践)。


Google的AAC示例展示了使用1个RecyclerView和1个LiveData的用法。如果您尝试使用3个RecyclerView和3个LiveDatas会出现什么问题? - Long Ranger
4个回答

56
根据开闭原则,您应该创建三个不同的ViewModel。这样做并不会增加太多复杂度,并且您可以很容易地将一个ViewModel(或者只是重新使用它)与相应的RecyclerView移动到另一个Activity中。
当然,有时候打破规则是有意义的 - 例如,如果您知道RecyclerView永远不会被重用或移动到另一个屏幕,那么您可以选择更简单的解决方案,只使用一个ViewModel
如果ViewModel(甚至带有3个列表)可能始终非常简单(只有三个LiveData字段,只有几行代码来填充它们),则您可以打破这个规则。
然而违反O / CP不是一种好习惯 - 这只是一个有意识的违反规则。

3
ViewModels之间可以相互通信吗?比如说一个ViewModel有一个LiveData对象,可以触发另一个ViewModel中的LiveData。将它们绑定在Activity中似乎不太合适,那么你会怎么做呢? - mol
1
我不知道你的使用情况是什么,但通常我会避免将一个ViewModel连接到另一个ViewModel。我宁愿创建另一个对象,并将相同的实例注入到两个ViewModels中。当然,这第三个共同的对象也可以有LiveData作为成员,其中一个ViewModel可以更新,而另一个则可以观察。如果您需要更详细的信息,请发布一个新问题,我很乐意回答。 - Piotr Aleksander Chmielowski

22

在这种情况下,我建议使用一个视图模型来填充三个不同的LiveData对象。这样,当您的三个请求之一获得响应时,UI就可以得到更新。有关如何使用带LiveData的RecyclerView的详细信息,请参阅Google示例

我认为在一个活动中有多个视图模型只会增加复杂性,并且我没有看到任何这样做的价值。


1
谷歌的示例链接已失效。 - Rajan Prasad
41
这么做有一个好处:可以减少RecyclerViews之间的耦合性,增加它们独立重用或在其他屏幕上移动的能力。 - Piotr Aleksander Chmielowski

4

我在一个碎片中使用了两个RecyclerView。我认为使用两个ViewModel更好。因为不同的RecyclerView有自己的数据请求和状态处理,特别是连接错误。 在这种情况下,将它们分成不同的ViewModel不会增加复杂性,但我认为它很符合解耦的规则。


0
更简单的方法是,您可以拥有一个ViewModel,它使用一个服务类,该服务类又使用三个存储库来获取数据。例如:
XActivity --> XViewModel --> XService --> {Arepository, Brepository, Crepository}

1
这个解决方案将使得ActivityViewModelService之间的耦合非常高,因此将一个RecyclerViewXActivity移动到YActivity会很困难。 - Piotr Aleksander Chmielowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接