我正在使用带有 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 运行(但这里我们不想滚动到顶部)。
一种可行的解决方案是传递PagingData.empty()
给PagingDataAdapter
并重新运行相同的查询(只是调用refresh
不起作用,因为PagingData
现在是空的并且没有什么可刷新的)但我更愿意保持我的旧数据可见,直到我知道刷新实际上成功了。