Android PagedList更新

Vla*_*kyy 13 android android-architecture-components

我的问题是如何更新PagedList中的项目?

就我而言,有ListActivity和DetailsActivity.列表活动正在使用Paging组件从网络(仅)获取帖子,并使用分页适配器在回收站视图中显示它.当用户按某些帖子时,我需要获取帖子详细信息并在DetailsActivity上显示.我正在向服务器发出另一个请求,它会返回我的帖子详细信息.在该调用之后,服务器增加该帖子的viewsCount值,当用户返回帖子列表时,我需要在列表项中更新该计数器.

问题是,如何在该PagedList中更新单个项目(post),因为我不需要从头开始重新加载所有列表只是为了更新单个项目.

Ash*_*agi 14

PagedList是不可变的

我建议您不要使用分页库,因为它假定您的数据是不可变的,这在实际用例中几乎是不可能的。

您可以在官方文档中进行检查。它说:

如果您有更细致的更新信号,例如网络API发出对列表中单个项目的更新信号,则建议将数据从网络加载到内存中。然后通过包装内存中快照的数据源将数据提供给PagedList。每次内存中的副本更改时,都将使先前的数据源无效,并且可以创建一个新的包装快照的新状态。

您必须从服务器获取数据,然后使用房间库将其存储到本地数据库中,然后每当需要更新任何项目时,将项目更新到本地数据库中,然后房间会将这些更改反映到UI中(使用LiveData) 。

但是随后您必须使用本地数据库进行分页。
如果有空间,您将拥有类似的东西。

@Dao
interface FeedDao {
@Query("SELECT * FROM feed ")
fun selectPaged(): DataSource.Factory<Int, Feed>
}
Run Code Online (Sandbox Code Playgroud)

但随后您必须处理更多类似的事情:

如果一个实体从远程服务器上删除怎么办。我们将如何注意到呢?
而且我们还必须从本地数据库中删除它

你可以阅读文章来解决这个问题。它说明了分页库中的所有问题以及如果您确实要使用分页库的可能的解决方法。

我的建议是使用库并实现您自己的分页。


Emm*_*uel 2

PagedListAdapter使用 a DiffUtil.ItemCallback,如果它认为现有项目是“新”项目,则只会更新现有项目。在我看来,您确实需要访问服务器才能获取新的视图计数,但您也不希望重绘未受影响的项目。可以通过添加视图计数属性来DiffUtil.ItemCallback确定新项目是什么来防止这种情况。具有新视图计数的项目将被重新绘制,其他项目则不会。

我假设检索第一个列表的原始请求返回viewsCount其中包含字段的对象。