Пейджинг 3. Как прокрутить RecyclerView до верхней части после того, как PagingDataAdapter завершил обновление И DiffUtiAndroid

Форум для тех, кто программирует под Android
Anonymous
Пейджинг 3. Как прокрутить RecyclerView до верхней части после того, как PagingDataAdapter завершил обновление И DiffUti

Сообщение Anonymous »

Я использую Paging 3 с RemoteMediator, который отображает кэшированные данные при получении новых данных из сети.
Когда я обновляю свой PagingDataAdapter (путем вызова обновления() на нем), я хочу, чтобы мой RecyclerView прокручивался вверх после завершения обновления. В лабораториях кода они пытаются справиться с этим через loadStateFlow следующим образом:

Код: Выделить всё

lifecycleScope.launch {
adapter.loadStateFlow
// Only emit when REFRESH LoadState for RemoteMediator changes.
.distinctUntilChangedBy { it.refresh }
// Only react to cases where Remote REFRESH completes i.e., NotLoading.
.filter { it.refresh is LoadState.NotLoading }
.collect { binding.list.scrollToPosition(0) }
}
Это действительно прокрутка вверх, но до завершения работы DiffUtil. Это означает, что если вверху действительно вставлены новые данные, RecyclerView не будет прокручиваться до конца вверх.
Я знаю, что адаптеры RecyclerView имеют AdaptorDataObserver обратный вызов, с помощью которого мы можем получить уведомление, когда DiffUtil завершит сравнение. Но это вызовет всевозможные состояния гонки с состояниями загрузки адаптера PREPEND и APPEND, что также приведет к запуску DiffUtil (но здесь мы не хотим прокручивать вверх).
Одним из решений, которое могло бы сработать, было бы передать PagingData.empty() в PagingDataAdapter и повторно выполнить тот же запрос (простой вызов обновления не сработает). потому что PagingData теперь пуст и обновлять нечего), но я бы предпочел, чтобы мои старые данные оставались видимыми до тех пор, пока я не узнаю, что обновление действительно прошло успешно.

Подробнее здесь: https://stackoverflow.com/questions/658 ... r-has-fini

Вернуться в «Android»