Метод 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: проверить: верно
1 ответ
Думаю, я нашел ответ.
Алгоритм Майерса не обрабатывает перемещаемые элементы, поэтому DiffUtil выполняет второй проход по результату, чтобы обнаружить перемещенные элементы.
https://developer.android.com/reference/androidx/recyclerview/widget/DiffUtil