1

我有一个包含 25 个具有稳定 ID 的项目的列表。当用户到达底部时,RecyclerView我将获取接下来的 25 个项目并显示整个列表(50、75 等)。

DiffUtil.CallbackareItemsTheSame正在使用值调用int oldItemPosition == int newItemPosition,我正在检查 id 并且它们是相同的,每次调用都返回 true(25 次调用)。所以下一个电话将是一系列的areContentsTheSame,我也期待着int oldItemPosition == int newItemPosition,但newItemPosition总是+13 ...

两种方法的第一次调用如下所示(来自 own Log

areItemsTheSame will return true, positions: 0 0
areItemsTheSame will return true, positions: 1 1
...
areContentsTheSame will return false, positions 0 13
areContentsTheSame will return false, positions 1 14
...

在这些电话之后,我正在记录更改ListUpdateCallback

onInserted pos: 25 count: 12
onChanged pos: 0 count: 25
onInserted pos: 0 count: 13

在重绘RecyclerView孩子之后,我看到每个项目都显示了完全不同的项目,并带有更改类型的动画(事实上,我被移到了项目 34+ 的底部,一次可见项目:4)

问题很简单:为什么?!

4

1 回答 1

1

看到这个链接

仅当 areItemsTheSame(int, int) 为这些项目返回 true 时才调用此方法。

oldItemPosition 项目在旧列表中的位置,newItemPosition项目在新列表中替换 oldItem 的位置

于 2019-07-22T13:37:08.087 回答