【发布时间】:2021-04-29 03:26:15
【问题描述】:
我正在使用带有 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 现在是空的并且没有什么可刷新的)但我更愿意让我的旧数据保持可见,直到我知道刷新确实成功了。
【问题讨论】:
-
你找到解决办法了吗?
-
@P1NG2WIN 不,我现在使用 300 毫秒的延迟,这有点糟糕
-
:(我会创建关于它的问题
-
@P1NG2WIN 是您造成的问题吗?如果是的话,你能把它链接在这里吗?
标签: android paging android-paging android-paging-library android-paging-3