在没有唯一标识符的项目上使用 "ListAdapter" areItemsTheSame
Using "ListAdapter" areItemsTheSame on items without unique identifier
要正确实现在 ListAdapter 的构造函数中传递的 DiffUtil.ItemCallback<T>
,必须同时实现 areItemsTheSame
和 areContentsTheSame
。
现在 areItemsTheSame
建议使用 . 类型的唯一标识符。因此,对于我的情况,数据 class 没有可推导的唯一标识符,我应该如何正确实施它?当在两个函数中简单地执行 oldItem == newItem
时,我显然会在项目上看到一个闪烁的动画,因为它认为这是一个完全不同的项目,因为 areItemsTheSame
返回 false。
那么人们如何正确解决这个问题呢?如果数据类型相同会触发 areContentsTheSame
是否会返回 true
是一个修复?如果不是,为什么?如果我现在这样做,回收商会正确地理解只有一些数据发生了变化,并且只有视图的必要部分“闪烁”了新数据。
那么人们如何正确解决这个问题?
“解决方案”是为每一行一个唯一标识符(这对大多数关系数据结构来说是个好建议)。
您可以在任一方法中组合字段,回调为您提供两个项目(旧的和新的),您可以决定在其中 do/compare 什么。
当项目“相同”(由您的实施决定)时,这允许 RecyclerView/Adapter 组合做出假设(和优化)。
当确定项目发生变化时(意味着它们现在是两个不同的项目),则必须发生一组不同的事情(动画、重新绑定、确定 viewType 等)。 UI.
的更多工作
所以不要与框架作对,而是提供一个唯一标识符,即使它由多个字段组成。我很想看看您的数据 class 以了解为什么没有唯一的方法来识别单行。
要正确实现在 ListAdapter 的构造函数中传递的 DiffUtil.ItemCallback<T>
,必须同时实现 areItemsTheSame
和 areContentsTheSame
。
现在 areItemsTheSame
建议使用 . 类型的唯一标识符。因此,对于我的情况,数据 class 没有可推导的唯一标识符,我应该如何正确实施它?当在两个函数中简单地执行 oldItem == newItem
时,我显然会在项目上看到一个闪烁的动画,因为它认为这是一个完全不同的项目,因为 areItemsTheSame
返回 false。
那么人们如何正确解决这个问题呢?如果数据类型相同会触发 areContentsTheSame
是否会返回 true
是一个修复?如果不是,为什么?如果我现在这样做,回收商会正确地理解只有一些数据发生了变化,并且只有视图的必要部分“闪烁”了新数据。
那么人们如何正确解决这个问题?
“解决方案”是为每一行一个唯一标识符(这对大多数关系数据结构来说是个好建议)。
您可以在任一方法中组合字段,回调为您提供两个项目(旧的和新的),您可以决定在其中 do/compare 什么。
当项目“相同”(由您的实施决定)时,这允许 RecyclerView/Adapter 组合做出假设(和优化)。
当确定项目发生变化时(意味着它们现在是两个不同的项目),则必须发生一组不同的事情(动画、重新绑定、确定 viewType 等)。 UI.
的更多工作所以不要与框架作对,而是提供一个唯一标识符,即使它由多个字段组成。我很想看看您的数据 class 以了解为什么没有唯一的方法来识别单行。