Библиотека подкачки Android: как показать связанный элемент, если он еще не находится в локальной базе данных и не прерывает пейджинг? - PullRequest
0 голосов
/ 26 марта 2019

Я пишу чат-приложение.Сообщения загружаются по страницам (элемент keyed - message_id) с помощью библиотеки подкачки Android.Также есть функция «Ответить», которая означает, что пользователи могут отвечать на любое сообщение в чате.В RecyclerView это должно выглядеть так:

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

Это просто, когда связанное сообщение уже находится в локальной базе данных.Я могу получить все данные из базы данных и показать его в приложении.Но могут быть ситуации, когда ответное сообщение НЕ находится в локальной базе данных (например, это старое сообщение, и мы только что установили приложение - база данных пуста).И сообщение выглядит плохо до тех пор, пока ответное сообщение не будет сохранено в локальной базе данных:


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

Что я пробовал: Если свойство сообщения reply_to не равно нулю, я загружаю ответное сообщение изудаленный сервер по этому идентификатору и сохранить его в локальной базе данных.Комната реагирует на изменения и отображает весь контент нормально.Но это ответное сообщение становится последним в моем массиве сообщений, и BoundaryCallback загружает сообщения после того, как это ответное сообщение пропускает сообщения между РЕАЛЬНЫМ последним сообщением и этим ответным сообщением.

Например, у меня есть сообщения с идентификаторами 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
}

Как я могу показать ответное сообщение и не прерывать пейджинг?Как это сделать правильно?

1 Ответ

1 голос
/ 29 марта 2019

Я нашел решение. В моем случае я создал дополнительную таблицу RepliedMessage (которая является абсолютной копией Message) и храню ответные сообщения в этой таблице. Нумерация страниц работает отлично. Нам нужно только поддерживать RepliedMessages в актуальном состоянии.

...