如何使用 Paging 3 库更新单个项目

Posted

技术标签:

【中文标题】如何使用 Paging 3 库更新单个项目【英文标题】:How to update single item using Paging 3 library 【发布时间】:2020-11-17 18:50:26 【问题描述】:

我正在尝试使用 Paging 3 库中的 PagingAdapter 来更新回收站视图中的单个项目。我发现只有一种使用 PagingAdapter.refresh() 方法的方法。但是这种方法强制从网络加载所有列表。有人知道如何在不从网络加载所有页面的情况下实现它吗?

【问题讨论】:

【参考方案1】:

目前,更新支持数据集的唯一方法是使列表无效并重新加载。对于使用缓存层(在 db 中,例如房间或内存中)的分层源,这通常是一个可以接受的廉价选择,尽管正在进行的工作是支持更精细的更新(请参阅https://issuetracker.google.com/160232968)。

就目前的分层源而言,您需要将网络调用移动到 RemoteMediator 中,您可以在 Pager 的构造函数中注册它,并将您的网络获取缓存到像 Room (它可以为您生成一个PagingSource 实现),或者自己编写一个内存中的实现。

codelab 和 DAC docs 是一个很好的资源,并且有代码示例来指导您!

【讨论】:

RemoteMediator 和自定义 PagingSource 是否会同时使用自定义内存存储?我认为自定义 PagingSource 会观察内存存储中的变化,然后使其自身失效。当单个项目的更新任务异步发生并且用户将RecyclerView滚动到该项目不再出现在屏幕上的点时,这是否仍会按预期运行? 在失效时,分页使用以用户当前位置为中心的密钥通过PagingSource.getRefreshKey 重新加载。新一代是通过 DiffUtil 动画的,所以是的,这应该可以工作。 您的 RemoteMediator 不应该消耗缓存,只需写入它(跟踪要加载的下一个远程键除外)【参考方案2】:

例子:

fun markItemAsRead(position: Int) 
        snapshot()[position].read = true
        notifyItemChanged(position)
    

来源:https://jermainedilao.medium.com/android-paging-3-library-how-to-update-an-item-in-the-list-52f00d9c99b2

【讨论】:

请注意,此函数位于适配器内部。【参考方案3】:
(adapterComment.snapshot().items as MutableList<Model>)[position].likeStatus = 0
adapterComment.notifyItemChanged(position)

【讨论】:

以上是关于如何使用 Paging 3 库更新单个项目的主要内容,如果未能解决你的问题,请参考以下文章

在 Paging 3 库 Android Kotlin 中更新当前页面或更新数据

单击 Paging 3 库中的项目加载更多数据

如何检查 Paging 3 库中的列表大小或空列表

如何使用单个实体或单个存储库设计两个不同的项目?

如何在 Paging 3 中使用网络绑定资源?

Git 如何只更新项目中某个目录里的文件