我正在使用带有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
现在为空,没有东西可以刷新),但我更愿意保留旧数据,直到我知道刷新成功为止。