当前位置: 首页 > 知识库问答 >
问题:

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

朱啸
2023-03-14

在MVVM模式中,ViewModel包含业务逻辑,并在需要更新时通知视图。视图还会通知用户事件。

据我所知,每个模型都应该有一个关联的ViewModel。因此,如果我们有以下模型:

  • 用户
  • 账目

我们将有以下视图模型:

  • UserViewModel
  • 帐户视图模型

然而,我找到的所有关于MVVM数据绑定的示例,都使用一个ViewModel作为布局。最近,谷歌在架构组件中引入了ViewModel类。这让我相信,一个活动将有一个连接到所有相关模型的ViewModel:

用户/帐户--

如果我们想到RecyclerView,这就变得更加复杂了。每个适配器项本身可能是一个ViewModel,所以具有RecyclerView的活动在列表中会有多个ViewModel,并为剩余的视图内容加上一个主视图(假设它们需要来自ViewModel的信息)。例如:

在本例中,我们有一个Account ViewModels列表和一个UserViewModel。如何将其嵌入到单个ActivityViewModel中?

共有3个答案

郜修雅
2023-03-14

单视图模型是标准的。然而,就连谷歌也暗示,你可能有不止一个视图模型。当你把一个手机应用程序升级为平板电脑应用程序时,这就非常方便了。当您在一个选项卡视图上组合多个手机视图时,可以方便地重新使用这些模型。

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

然而,一个视图是非常标准的,正如上面提到的,你应该有理由使用多个视图。

陈实
2023-03-14

谷歌建议你使用1ViewModelperView(即ActivityFragment)https://youtu.be/Ts-uxYiBEQ8?t=8m40s),然后在每个ViewModel中,可以有多个类型的模型。然而,MVVM的原则是每个ViewModel只有一种模型类型,因此谷歌的演示与之相矛盾:/。我想你必须决定哪种方法更适合你的应用。

关于你提到的列表示例,你不会这样做,对于列表,你会使用分页库。你可以在我上面链接的视频末尾看到如何使用它的详细信息。

葛承教
2023-03-14

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

这些概念也可以在谷歌在上一次谷歌I/O中推荐的应用程序架构中看到,其中一个活动/片段有一个带有多个LiveData的ViewModel:

 类似资料:
  • 问题内容: 我读到每个应用程序都在自己的JVM中运行。为什么会这样呢?他们为什么不让一个JVM运行2个或更多应用程序? 我说的是通过公共静态void main(String [])方法启动的应用程序…) 问题答案: (我假设您正在谈论通过方法启动的应用程序…) 理论上,您可以在JVM中运行多个应用程序。实际上,它们可以以各种方式相互干扰。例如: JVM具有一组System.in/out/err,一

  • 例如,下面是一个。它处理对象上的CRUD操作。如果我希望存储库也保存对象,我将如何更改下面的接口以容纳这两个对象呢?

  • 问题内容: 我了解主键的价值。 我了解索引的价值。 每个 MySQL表都应该有一个自动递增的主键(最好是INT字段类型)吗? 更新 @Raj More的答案似乎是最有效的。但是,我想到的问题是,此自动递增的主键ID将如何与其他表相关。例如: 表格1 表2 在上面的示例中,消费者可以来到该站点并选择注册免费的产品/服务。如果消费者选择,他们可以提供其他信息(存储在表2中)以进行其他邮件发送等。我看到

  • 我在3台虚拟机上安装了hadoop 3.1.1,在Ubuntu上安装了VMware。当我运行hdfs namenode时,格式化并启动所有。sh然后jps在我的主节点和两个从节点上正常工作。 但是,使用hdfs dfsadmin-report命令,我只能看到一个活动数据节点(当我检查master:50070或8088时得到相同的结果)。 我试图禁用防火墙如下:ufw禁用,但它没有解决问题。这3台机

  • 我正在用导航抽屉做一个应用程序。为此,我有一个HomeActivity,它包含我导航抽屉的所有登录、菜单中的选项、视图、标题等。在这里,我设置listenerclick以获取导航元素。此侦听器接收FragmentManager,并使用开关执行以下操作: 将片段替换为我在每个开关情况下需要的片段。 在家庭布局中,我有一个框架布局和抽屉菜单。 Mi的问题是,我只有一个具有framelayout的活动,

  • 好吧,正如我试图在标题中总结的那样,下面是细节。 我们有一个相对较大的应用程序,它使用Dagger,以非常不理想的方式,所以我们决定开始编写测试,为此,我需要公开Mockito的依赖项,因此,我面临一个问题,开始使用单例工厂提供视图模型,仍然适用,并且有大量的教程可以解释这一点。 在我们的应用程序中,有许多使用单个活动实现的功能和导航组件,该单个活动有时具有创建的视图模型,我们使用该模型在容器活动