首页 > 解决方案 > 聊天应用程序中的分页库

问题描述

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

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

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

标签: androidfirebasepaginationgoogle-cloud-firestoreandroid-paging

解决方案


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

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

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

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

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

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

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

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


推荐阅读