为什么在DiffUtil RecyclerView中要同时使用areItemsTheSame和areContentsTheSame?

10
为什么在DiffUtil RecyclerView中需要同时使用areItemsTheSame和areContentsTheSame?我不理解,我认为只用areItemsTheSame比较数据就足够了。能否更详细地解释一下?谢谢。
2个回答

13

尽可能简短:

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

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


如果列表中的对象是不可变的,则您可能没有注意到区别,可以始终从areContentsTheSame返回true,但当您的项目可以更新时,这很重要。

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

Movie A rated at 5 stars
Movie A rated at 4 stars

在计算差异时,会进行以下调用:

  1. areItemsTheSame:检查两个对象是否表示相同的项目(电影A),返回true
  2. areContentsTheSame:检查内容是否相同(星级评分),不相同 - 返回false
  3. getChangePayload:当 areContentsTheSame 返回false时调用。这是一个可选的重写方法,可以用于返回部分视图更新的载荷对象。在此示例中,它可以返回 4 (星星)。

感谢您的解释,但是如果我的数据列表没有ID,为什么我们需要使用“areItemTheSame”方法?假设您正在比较像这样的数据列表:“data class(firstname,lastname)”。在这个例子中,我们没有ID或任何唯一参数,那么如何使用DiffUtil实现这个数据列表呢? - Mehrzad
@Mehrzad DiffUtil 用于计算列表间的差异,并仅向适配器分派必要的更改。如果您的项目没有标识符或其他方式来满足 areItemsTheSame 合同,则运行 DiffUtil 是毫无意义的,因为它无法确定添加/删除/移动。 - Pawel

2

areItemsTheSame(T, T) 用于判断两个对象是否相同。如果不相同,则需要添加/删除该项。

areContentsTheSame 只有在 areItemsTheSame(T, T) 返回 true 时才会被调用。在这种情况下,该项以前是可用的,但内容已更改,因此应显示相应的更改。

getChangePayload (T oldItem, T newItem)areItemsTheSame(T, T) 返回 true 并且 areContentsTheSame(T, T) 返回 false 的情况下被调用,以获取有关更改的有效负载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接