我正在使用带有 RemoteMediator 的 Paging 3,它在从网络获取新数据时显示缓存数据。
当我刷新我的 PagingDataAdapter
(通过调用 refresh()
就可以了)我希望我的 RecyclerView 在刷新完成后滚动到顶部。在 codelabs他们试图通过 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
现在是空的,没有可刷新的内容),但我更愿意保持旧数据可见,直到我知道刷新实际上成功为止。
最佳答案
在某些情况下,例如搜索静态内容,我们可以返回 false
里面 areItemsTheSame
的 DiffUtil.ItemCallback
作为一种解决方法。我也用它来改变排序属性。
关于android - Paging 3 - 如何在 PagingDataAdapter 完成刷新并且 DiffUtil 完成差异后滚动到 RecyclerView 的顶部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65882817/