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

#android #kotlin #android-recyclerview #android-diffutils #android-paging-3

#Android #kotlin #android-recyclerview #android-diffutils #android-подкачка-3

Вопрос:

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

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

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

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

Logcat:

Я: новый элемент: 3308 = Старый элемент: 3308 Я: проверка: истина
Я: новый элемент: 3307 = Старый элемент: 3307 Я: проверка: истина
Я: Новый элемент: 3306 = Старый элемент: 3306 Я: проверка: истина
Я: новый элемент: 3305 = Старый элемент: 3305 Я: проверка: истина
Я: новый элемент:3304 = Старый элемент: 3304 I: проверка: истина
I: новый элемент: 3303 = Старый элемент: 3303 I: проверка: истина
I: Новый элемент: 3302 = Старый элемент: 3302 I: проверка: истина
I: Новый элемент: 3301 = Старый элемент: 3301 I: проверка: истина
I: Новый элемент: 3300 = Старый элемент:3300 I: проверка: истина
I: newItem: 3300 = oldItem: 3300 I: проверка: истина
I: newItem: 3301 = oldItem: 3301 I: проверка: истина
I: newItem: 3302 = oldItem: 3302 I: проверка: истина
I: newItem: 3303 = oldItem: 3303 I: проверка: true
Я: newItem: 3304 = oldItem: 3304 Я: проверка: true
Я: newItem: 3305 = oldItem: 3305 Я: проверка: true
Я: newItem: 3306 = oldItem: 3306 Я: проверка: true
Я: newItem: 3307 = oldItem: 3307 Я: проверка: true
Я:Новый элемент: 3308 = Старый элемент: 3308 Я: проверка: истина

VacancyFragment: введите описание изображения здесь

Адаптер: введите описание изображения здесь

ViewModel: введите описание изображения здесь

Источник данных: введите описание изображения здесь

Комментарии:

1. пожалуйста, опубликуйте полный код метода обновления (т.Е. Точное место, где вы вызываете diff util)

2. Я добавил код VacancyFragment, Adapter, ViewModel и DataSource

3. Метод areContentsTheSame() проверяет один раз

4. submitData и refresh методы тоже, если вы не возражаете

5. методы отправки и обновления являются встроенными методами.

Ответ №1:

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

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

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