【问题标题】:Paging Library in Chat App聊天应用程序中的分页库
【发布时间】:2018-10-13 23:50:35
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    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>,最后使用分页列表在聊天应用程序的RecyclerView中显示消息。然后,当您在 DB 中插入、更新或删除数据时,这些更改将自动传播到 UI。这可能非常有用。

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

    【讨论】:

      猜你喜欢
      • 2019-08-06
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多