Когда я обновляю свой 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) }
}
Я знаю, что адаптеры RecyclerView имеют AdaptorDataObserver обратный вызов, с помощью которого мы можем получить уведомление, когда DiffUtil завершит сравнение. Но это вызовет всевозможные состояния гонки с состояниями загрузки адаптера PREPEND и APPEND, что также приведет к запуску DiffUtil (но здесь мы не хотим прокручивать вверх).
Одним из решений, которое могло бы сработать, было бы передать PagingData.empty() в PagingDataAdapter и повторно выполнить тот же запрос (простой вызов обновления не сработает). потому что PagingData теперь пуст и обновлять нечего), но я бы предпочел, чтобы мои старые данные оставались видимыми до тех пор, пока я не узнаю, что обновление действительно прошло успешно.
Подробнее здесь: https://stackoverflow.com/questions/658 ... r-has-fini