在聊天应用程序中分页库

时间:2018-05-03 15:33:35

标签: android firebase pagination google-cloud-firestore android-paging

根据Google的Yigit Boyar的回复,实时数据不是聊天应用的最佳用例,因为如果它们同时出现,可能会丢失显示某些项目。他建议使用新的Google的分页库。我一直在为我的收件箱使用ItemKeyedDataSource(所有向用户发送消息的人)和内部聊天(消息本身)。问题如下:

1-在聊天中,当用户向下滚动时,用户检索旧消息,这意味着这些消息的插入应该在适配器的位置0,而不是像分页库那样顺序。如何将插入项目的位置按顺序替换为新消息,将位置0替换为旧消息?

2-从收件箱(向用户发送消息的人),我再次使用ItemKeyedDataSource,问题是我想从存储库维护多个文档监听器(我使用的是Firebase) Firestore),所以每次新人与用户交谈时我都能检测到。问题是callback.onResult仅被调用一次,并在Firebase发送另一个用户时失败。如何维护可更新的列表?

1 个答案:

答案 0 :(得分:3)

我知道这个答案可能为时已晚,但也许可以在将来对某人有所帮助。

RecyclerView中项目的位置由PagedList 中相应数据对象(类型T)的位置确定。 PagedList的设计看起来与旧的List 相似,但是可以认为是元素的“无尽”列表。

PagedList通过称为DataSource.Factory的按需获取页面元素。之所以使用Factory,是因为DataSource本身只能沿一个方向增长。如果需要在PagedList中添加元素,或者更改或删除现有元素,则必须使DataSource无效,然后将通过DataSource.Factory创建一个新实例。

因此,要将数据元素插入所需的位置,应通过将这些基类子类化来实现自己的DataSource和DataSource.Factory。

注意:Room是AndroidX的数据持久性库,它提供了一些功能,可以自动为您的数据生成这些类的实例。您可以这样编写SQL查询:

SELECT * FROM messages WHERE threadId=:threadId ORDER BY timestamp DESC

然后从中获取DataSource.Factory,使用工厂创建LivaData >,最后使用分页列表在聊天应用程序的RecyclerView中显示消息。然后,当您在数据库内部插入,更新或删除数据时,这些更改将自动传播到UI。这可能非常有用。

我建议您阅读一些与代码实验室相关的示例: