在没有唯一标识符的项目上使用 "ListAdapter" areItemsTheSame

Using "ListAdapter" areItemsTheSame on items without unique identifier

要正确实现在 ListAdapter 的构造函数中传递的 DiffUtil.ItemCallback<T>,必须同时实现 areItemsTheSameareContentsTheSame

现在 areItemsTheSame 建议使用 . 类型的唯一标识符。因此,对于我的情况,数据 class 没有可推导的唯一标识符,我应该如何正确实施它?当在两个函数中简单地执行 oldItem == newItem 时,我显然会在项目上看到一个闪烁的动画,因为它认为这是一个完全不同的项目,因为 areItemsTheSame 返回 false。

那么人们如何正确解决这个问题呢?如果数据类型相同会触发 areContentsTheSame 是否会返回 true 是一个修复?如果不是,为什么?如果我现在这样做,回收商会正确地理解只有一些数据发生了变化,并且只有视图的必要部分“闪烁”了新数据。

那么人们如何正确解决这个问题?

“解决方案”是为每一行一个唯一标识符(这对大多数关系数据结构来说是个好建议)。

您可以在任一方法中组合字段,回调为您提供两个项目(旧的和新的),您可以决定在其中 do/compare 什么。

当项目“相同”(由您的实施决定)时,这允许 RecyclerView/Adapter 组合做出假设(和优化)。

当确定项目发生变化时(意味着它们现在是两个不同的项目),则必须发生一组不同的事情(动画、重新绑定、确定 viewType 等)。 UI.

的更多工作

所以不要与框架作对,而是提供一个唯一标识符,即使它由多个字段组成。我很想看看您的数据 class 以了解为什么没有唯一的方法来识别单行。