我有一个问题与MVVM的正确设计和架构有关,而不是与编码本身有关.在我的项目中,我遇到的情况是ViewModel上提供数据,后来在RecyclerView.Adapter中使用这些数据来创建正确的视图.
但是,我想知道这是否正确(从正确的“做事方式” POV)是否将某些数据以ID的形式提供,以便进一步从Room或外部服务器获取?例如,在onBindViewHolder期间,使用带有live()的LiveData在满载时更新某些字段.
解决方法:
在视图中获取数据是不行的.它违背了MVVM的宗旨,尤其是Android Jetpack的努力.主要原因之一是数据需要保留配置.在视图中放置“数据获取”机制会失败,因为可以在需要时随时破坏和重新创建视图.
因此,我建议您确保对网络或与此相关的任何其他数据源的所有调用都围绕ModelView而不是视图.让虚拟机通过观察器将数据馈送到视图.
我刚才说的例外是用例,例如用Picasso或Glide加载图像,然后通过它们向它们提供URL并加载图像.但这是另一回事,因为它们旨在处理这些问题.
更新跟进问题
it’s ok to put observe() still inside Adapter, during the binding process?
没有!发送到适配器的数据必须符合预期的用途.例如,如果您必须执行“待办事项”应用程序,并且“*活动”显示所有待办事项,则必须供稿适配器完成数据(标题,创建时间等).
不应获取不需要显示的数据(例如描述或子列表),并且不需要标识特定的数据(除非您仅出于避免第二个网络的目的而存储它们)调用并将它们作为序列化数据传递给下一个活动).
当用户单击特定的待办事项时,然后使用其自己的ViewModel启动新活动,该活动将获取该活动的详细信息(假设您通过意图传递了一些ID).
If the first, then I understand that observe() should not only update data, but also populate it later to Observer and call notifyDataSetChanged(), right?
观察是一种在数据已更改或旧视图被破坏时将数据发布到视图的方法,因此,将为新视图提供与在“视图失效”后仍然有效的旧数据相同的数据.因此,在同一方法中,应该完成适配器数据的更新,并因此调用notifyDataSetChanged()或类似方法.
我希望这一点很清楚.