DiffUtil.ItemCallback areItemsTheSame() 方法检查项目两次

DiffUtil.ItemCallback areItemsTheSame() method check items twice

我向 /list.php?page=1 发送请求并使用 Paging 3 组件在 UI 中显示数据。

在第一个请求中,areItemsTheSame(new, old) 方法什么都不做。没有登录 Logcat.

然后我使用 SwipeRefreshLayout 刷新数据并发送相同的请求api (/list.php?page=1).

DiffUtil.ItemCallback areItemsTheSame(new, old) 方法检查项目两次。一次降序,然后升序。

Logcat:

I: newItem: 3308 = oldItem: 3308 I: check: true
I: newItem: 3307 = oldItem: 3307 I: check: true
I: newItem: 3306 = oldItem: 3306 I: check: true
I: newItem: 3305 = oldItem: 3305 I: check: true
I: newItem: 3304 = oldItem: 3304 I: check: true
I: newItem: 3303 = oldItem: 3303 I: check: true
I: newItem: 3302 = oldItem: 3302 I: check: true
I: newItem: 3301 = oldItem: 3301 I: check: true
I: newItem: 3300 = oldItem: 3300 I: check: true
I: newItem: 3300 = oldItem: 3300 I: check: true
I: newItem: 3301 = oldItem: 3301 I: check: true
I: newItem: 3302 = oldItem: 3302 I: check: true
I: newItem: 3303 = oldItem: 3303 I: check: true
I: newItem: 3304 = oldItem: 3304 I: check: true
I: newItem: 3305 = oldItem: 3305 I: check: true
I: newItem: 3306 = oldItem: 3306 I: check: true
I: newItem: 3307 = oldItem: 3307 I: check: true
I: newItem: 3308 = oldItem: 3308 I: check: true

空缺片段:

适配器:

视图模型:

数据源:

我想我找到了答案。

Myers's algorithm does not handle items that are moved so DiffUtil runs a second pass on the result to detect items that were moved.

https://developer.android.com/reference/androidx/recyclerview/widget/DiffUtil