Метод DiffUtil.ItemCallback areItemsTheSame() проверяет элементы дважды

Я отправляю запрос на /list.php?page=1 и отображаю данные в пользовательском интерфейсе с компонентом Paging 3.

В первом запросе метод areItemsTheSame(новый, старый) ничего не делает. Нет входа в Logcat.

Затем я обновляю данные с помощью SwipeRefreshLayout и запрашиваю тот же API (/list.php?page=1).

Метод DiffUtil.ItemCallback areItemsTheSame(новый, старый) проверяет элементы дважды. один раз по убыванию, затем по возрастанию.

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: проверить: true
I: newItem: 3304 = oldItem: 3304 I: проверить: true
I: newItem: 3303 = oldItem: 3303 I: проверить: true
I: newItem: 3302 = oldItem: 3302 I: проверить: 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: проверить: верно

ВакансияФрагмент:

Адаптер:

ViewModel:

Источник данных:

1 ответ

Решение

Думаю, я нашел ответ.

Алгоритм Майерса не обрабатывает перемещаемые элементы, поэтому DiffUtil выполняет второй проход по результату, чтобы обнаружить перемещенные элементы.

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

Другие вопросы по тегам