在使用 ListAdapter 时,我注意到在更新项目后DiffUtil.ItemCallback areContentsTheSame()方法总是返回 true。调试代码我发现旧项和新项完全一样(旧状态消失了)。因此,没有调用ListAdapter onBindViewHolder()方法来更新列表中的相应行(只有项目的顺序通过漂亮的动画进行了更改)。
检查 Stackoverflow 上的其他问题似乎是许多开发人员面临的常见问题:
ListAdapter 未更新 reyclerview 中的项目
Recyclerview + Listadapter 中的项目不会在更新时重绘
具有 DiffUtil.ItemCallback 的 ListAdapter 始终认为对象相同
向 RecyclerView ListAdapter 提交新列表时,差异检查始终为 areContentsTheSame() 返回 true
但是,上述答案(如果有的话)都没有提供正确的解决方案。
它对我有用的唯一方法是每次观察者发出新结果时调用 ListAdapter 上的notifyDataSetChanged() 。
但是,如果通过强制 RecyclerView 重绘其内容(到目前为止它已显示的所有项目)而放弃了您可以获得的所有出色性能,那么使用 ListAdapter 和 submitList() 通知更改的全部意义是什么?
notifyDataSetChanged()
:
即使它有效,但如果您决定首先使用 ListAdapter,肯定不是正确的方法。
viewModel.getObjects().observe(this, listOfObjects -> listAdapter.submitList(new ArrayList<>(listOfObjects)));
:
没用。
更新列表中的项目后,我希望看到 UI 上发生的相应更改(不仅是排序顺序)对应的行如预期的那样。