ネットワークから新しいデータをフェッチしながら、キャッシュされたデータを表示する RemoteMediator で Paging 3 を使用しています。PagingDataAdapter
(呼び出して)リフレッシュrefresh()
すると、リフレッシュが完了した後に 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 アダプターには、AdapterDataObserver
DiffUtil が差分処理を終了したときに通知を受け取ることができるコールバックがあることを知っています。PREPEND
ただし、これにより、アダプターの読み込み状態とのあらゆる種類の競合状態がAPPEND
発生し、DiffUtil も実行されます (ただし、ここでは一番上までスクロールしたくありません)。
機能する解決策の 1 つは、 に渡しPagingData.empty()
てPagingDataAdapter
同じクエリを再実行することです (が空になり、更新するものが何もないrefresh
ため、呼び出すだけでは機能しませPagingData
ん) が、更新がわかるまで古いデータを表示したままにしておくことをお勧めします。実際に成功しました。