聊天应用中的分页库

And*_*rea 4 pagination android firebase google-cloud-firestore android-paging

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

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

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

小智 8

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

RecyclerView 中 item 的位置由 PagedList<T> 中相应数据对象(类型 T)的位置决定。PagedList 被设计成看起来很像旧的 List<T>,但可以被认为是一个“无限”的元素列表。

PagedList 通过名为 DataSource.Factory 的东西按需按页面获取其元素。使用工厂是因为 DataSource 本身只能向一个方向增长。如果您需要在 PagedList 中添加元素,或者更改或删除现有元素,您必须使 DataSource 无效,并且将通过 DataSource.Factory 创建一个新实例。

因此,要将数据元素插入到您想要的位置,您应该通过继承这些基类来实现您自己的 DataSource 和 DataSource.Factory。

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

SELECT * FROM messages WHERE threadId=:threadId ORDER BY timestamp DESC
Run Code Online (Sandbox Code Playgroud)

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

我建议你阅读一些相关的例子来做代码实验室: