用于延迟数据库下载的 RecyclerView Adapter 内的 Android ViewModel

Fis*_*szu 5 android mvvm viewmodel android-recyclerview

我有一个问题与 MVVM 的正确设计和架构有关,而不是与编码本身有关。在我的项目中,我遇到了一种情况,即 ViewModel 正在提供数据,稍后在 RecyclerView.Adapter 中使用这些数据来创建正确的视图。

但是,我想知道如果某些数据将以 ID 的形式提供以进一步从 Room 或外部服务器获取,这是否也是正确的(从正确的“做事方式”POV)?例如在 onBindViewHolder 期间使用一些 LiveData 和 observe() 以在成功加载时更新某些字段。

Ste*_*goo 6

在视图中进行数据获取是不行的。它违背了 MVVM 的目的,尤其是 Android Jetpack 的努力。一个重要的原因是数据需要在配置中存活下来。将“数据获取”机制放在视图中会破坏视图,因为视图可以在需要时随时销毁和重新创建。

因此,我建议您确保对网络或任何其他与此相关的数据源的所有调用都围绕ViewModel视图而不是视图。让 VM 通过观察者将数据馈送到 View。

我刚才所说的例外是这样的用例,例如使用 Picasso 或 Glide 加载图像,其中通过您提供 URL 并加载图像。但这是另一回事,因为它们旨在处理这个问题。

更新后续问题

在绑定过程中,可以将observe() 仍然放在Adapter 中吗?

不!发送到适配器的数据必须完全符合其预期用途。例如,如果您必须执行列表应用程序并且您的顶级活动显示所有待办事项,那么您必须馈送适配器将完成数据(标题、创建时间等)。

不应获取不会显示的数据(如描述或子待办事项列表)并且不需要识别特定的待办事项(除非您只想为了避免第二个网络而存储它们)调用并将它们作为序列化数据传递给下一个活动)。

当用户单击特定的待办事项时,然后使用自己的 ViewModel 启动新活动,该活动将获取该活动的详细信息(假设您有意传递了一些 ID)。

如果是第一个,那么我理解observe() 不仅要更新数据,还要稍后将其填充到Observer 并调用notifyDataSetChanged(),对吗?

Observe 是一种在视图发生更改或旧视图被破坏时将数据发布到视图的方法,因此新视图将获得在“视图死亡”中幸存下来的相同旧数据。所以应该在相同的方法中更新适配器的数据,因此调用notifyDataSetChanged()或类似的方法。

我希望这能说清楚。