8

ネットワークから新しいデータをフェッチしながら、キャッシュされたデータを表示する 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 アダプターには、AdapterDataObserverDiffUtil が差分処理を終了したときに通知を受け取ることができるコールバックがあることを知っています。PREPENDただし、これにより、アダプターの読み込み状態とのあらゆる種類の競合状態がAPPEND発生し、DiffUtil も実行されます (ただし、ここでは一番上までスクロールしたくありません)。

機能する解決策の 1 つは、 に渡しPagingData.empty()PagingDataAdapter同じクエリを再実行することです (が空になり、更新するものが何もないrefreshため、呼び出すだけでは機能しませPagingDataん) が、更新がわかるまで古いデータを表示したままにしておくことをお勧めします。実際に成功しました。

4

6 に答える 6

2

静的コンテンツの検索などの場合、回避策としてfalse内部areItemsTheSameに戻ることができDiffUtil.ItemCallbackます。これは、ソート プロパティの変更にも使用します。

于 2021-06-18T17:01:11.563 に答える