在Android上使用MVVM时,每个Activity应该有一个(并且只有一个)ViewModel吗?

fhs*_*lva 21 android mvvm

MVVM模式上,ViewModel包含业务逻辑,并在需要更新时通知View.关于用户事件的视图也会通知它.

据我所知,每个Model都应该有一个关联的ViewModel.那么,如果我们有以下型号:

  • 用户
  • 帐户

我们将拥有以下ViewModel:

  • UserViewModel
  • AccountViewModel

但是,我发现有关与MVVM绑定数据的所有示例,都使用单个ViewModel作为布局.最近,Google 在Architecture Components中引入了ViewModel类.这让我相信一个Activity会有一个可以连接到所有相关模型的ViewModel:

用户/帐户 - > ActivityViewModel

如果我们想到RecyclerView,这会变得更加复杂.每个适配器项目本身可以是ViewModel,因此具有RecyclerView的Activity将在列表中包含多个ViewModel,并为剩余的视图内容添加一个主模块(假设它们需要来自ViewModel的信息).例如:

在此输入图像描述

在此示例中,我们有一个Account ViewModel列表和一个UserViewModel.如何将其嵌入到单个ActivityViewModel中?

Fra*_*nco 10

谷歌建议您使用1对ViewModelView(即,ActivityFragment)(见https://youtu.be/Ts-uxYiBEQ8?t=8m40s),然后内部的每个ViewModel可以有超过1种类型的模型.但是,MVVM原则是每个只有1个模型类型ViewModel,因此谷歌的演示文稿与:/.我想你必须决定哪种方法更适合你的应用.

对于您使用分页库的列表,您提到的列表示例,不是您的方法.您可以在我上面链接的视频的末尾看到有关如何使用此功能的详细信息.


Edu*_*rdo 9

每个视图(活动视图,片段视图或自定义视图)应该具有一个ViewModel,并具有多个LiveData,每个逻辑单元一个。在图像中,一个逻辑单元是用户数据,另一个逻辑单元是设置数据,因此您将在ViewModel中公开两个LiveData。

使用多个LiveData查看

这些概念也可以在上次Google I / O中提出的推荐应用架构google中看到,其中活动/片段具有1个ViewModel和多个LiveData:

在此处输入图片说明


Her*_*ker 7

一种视图模型是标准的。但是,即使是 google 也建议您可能有多个视图模型。当您将手机应用程序迁移到平板电脑应用程序时,这非常方便。当您在单个选项卡视图上组合多个手机视图时,可以方便地重用模型。

如果您在编码时牢记 SOLID 原则,那么 S(一个类的单一责任)可能会导致您使用多个视图模型。

但是,每个视图一个几乎是标准的,并且如上所述,您应该有理由使用多个视图。