android - Paging 3 - 如何在 PagingDataAdapter 完成刷新并且 DiffUtil 完成差异后滚动到 RecyclerView 的顶部?

标签 android paging android-paging android-paging-library android-paging-3

我正在使用带有 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里面 areItemsTheSameDiffUtil.ItemCallback作为一种解决方法。我也用它来改变排序属性。

关于android - Paging 3 - 如何在 PagingDataAdapter 完成刷新并且 DiffUtil 完成差异后滚动到 RecyclerView 的顶部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65882817/

相关文章:

asp.net - ASP.NET MVC 中的分页

android - 如何在 Android 4.0 upper 的底部创建一个菜单

java - IOException : failed to connect to/192. 168.70.1(端口 9900):连接失败:ETIMEDOUT(连接超时)

android - 为什么软键盘在简历上被隐藏了?

android - 如何检查线程是否完成执行Android Studio

c# - 分页 Web API 返回的大量数据

android - Paging库在向上滑动刷新后只调用LoadInitial,不调用LoadAfter

android - 在 Jetpack Compose 中调用分页数据的刷新方法无法正常工作

android - 如何将 PagedListAdapter 与多个 LiveData 一起使用

android - 在 Repository 类中观察 Forever 是一个好习惯吗? db+network 分页列表