为什么在 diffutil recyclerview 中使用 areItemsTheSame 和 areContentsTheSame?

Meh*_*zad 11 android compare list android-recyclerview android-diffutils

areItemsTheSame为什么需要与areContentsTheSameat diffutil recyclerview一起使用?我不明白我认为 areItemsTheSame 足以比较数据吗?可以给我更多解释吗?谢谢

Paw*_*wel 16

尽可能短:

areItemsTheSame- 用于确定新旧列表之间的结构变化(添加/删除/位置更改)

areContentsTheSame- 确定特定项目是否已更新


如果列表中的对象是不可变的,您可能没有注意到差异,并且可能总是返回trueareContentsTheSame但何时可以更新您的项目确实很重要。

DiffUtil.ItemCallback有 3 个方法是有原因的。假设您正在比较两个对象:

Movie A rated at 5 stars
Movie A rated at 4 stars
Run Code Online (Sandbox Code Playgroud)

当计算 diff 时,会进行以下调用:

  1. areItemsTheSame:检查两个对象是否代表相同的项目(电影 A),返回 true
  2. areContentsTheSame:检查内容是否相同(星级),否则返回 false
  3. getChangePayloadareContentsTheSame:返回 false时调用。它是一个可选覆盖,可用于返回有效负载对象以进行ViewHolder 的部分更新。在此示例中,它可以返回4(星号)。