根据Google的Yigit Boyar的回复,实时数据不是聊天应用的最佳用例,因为如果它们同时出现,可能会丢失显示某些项目。他建议使用新的Google的分页库。我一直在为我的收件箱使用ItemKeyedDataSource(所有向用户发送消息的人)和内部聊天(消息本身)。问题如下:
1-在聊天中,当用户向下滚动时,用户检索旧消息,这意味着这些消息的插入应该在适配器的位置0,而不是像分页库那样顺序。如何将插入项目的位置按顺序替换为新消息,将位置0替换为旧消息?
2-从收件箱(向用户发送消息的人),我再次使用ItemKeyedDataSource,问题是我想从存储库维护多个文档监听器(我使用的是Firebase) Firestore),所以每次新人与用户交谈时我都能检测到。问题是callback.onResult
仅被调用一次,并在Firebase发送另一个用户时失败。如何维护可更新的列表?
答案 0 :(得分:3)
我知道这个答案可能为时已晚,但也许可以在将来对某人有所帮助。
RecyclerView中项目的位置由PagedList
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
我建议您阅读一些与代码实验室相关的示例: