【问题标题】:Android Paging Library: how to show related item if it's not in local database yet and don't break paging?Android分页库:如果它不在本地数据库中并且不中断分页,如何显示相关项目?
【发布时间】:2019-03-26 10:30:35
【问题描述】:

我正在编写聊天应用程序。消息是使用 Android 分页库按页面(项目键控 - message_id)加载的。还有“回复”功能,这意味着用户可以回复聊天中的任何消息。在 RecyclerView 中应该是这样的:

Part of message which was replied...
------------------------------------
Main message text

很简单,当相关消息已经在本地数据库中时。我可以从数据库中获取所有数据并将其显示在应用程序中。但是可能会出现回复消息不在本地数据库中的情况(例如,这是旧消息,我们刚刚安装了应用程序 - 数据库为空)。而且消息看起来很糟糕,直到回复的消息不会存储在本地数据库中:


------------------------------------
Main message text

我尝试过的:如果消息的属性reply_to 不为空,我会通过此ID 从远程服务器加载回复的消息并将其存储在本地数据库中。房间对变化做出反应并很好地显示所有内容。但是这条回复的消息成为我的消息数组中的最后一条消息,并且 BoundaryCallback 在回复消息之后加载消息,在真实的最后一条消息和回复的消息之间跳过消息。

例如,我有 id 为 1..100 的消息。

(boundary callback makes initialLoad, say 20 items)
1 message
2 message
..
10 message with reply to 50 message (load message 50 and store it in db)
11 message
..
(early loaded messages)
..
20 message
(this should be end, but this is not because of 50 message which is stored in local database now)
50 message
(bounary callback makes loadAfter new items by key - message id)
51 message
..

所以,我们丢失了从 21 到 49 的部分消息。

消息室实体具有以下属性:

@Entity
class Message {
    var id: Int
    var text: String
    var reply_to: Int?
}

MessageModel 由 Room 通过关系返回,并在 PagedAdapter 中使用

class MessageModel {
    var message: Message
    var repliedMessage: Message
}

我怎样才能显示回复的消息而不中断分页? 应该如何以正确的方式完成?

【问题讨论】:

    标签: android kotlin android-room android-paging


    【解决方案1】:

    我找到了解决方案。在我的例子中,我创建了额外的表 RepliedMessage(它是 Message 的绝对副本),并将回复的消息存储在该表中。分页工作完美。我们只需要让 RepliedMessages 保持最新。

    【讨论】:

      猜你喜欢
      • 2016-09-28
      • 2021-08-20
      • 2022-07-27
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多