Библиотека подкачки в приложении чата - PullRequest
0 голосов
/ 03 мая 2018

Согласно ответу, сделанному Йигитом Бояром из Google, Live Data - не лучший вариант использования для приложения чата, потому что оно может потерять отображение некоторых элементов, если они появятся одновременно. Он рекомендует использовать новую пейджинговую библиотеку Google. Я использую ItemKeyedDataSource для своей входящей почты (всех людей, у которых есть сообщения пользователя) и внутреннего чата (сами сообщения). Проблемы заключаются в следующем:

1- Из чата, когда пользователь прокручивает страницу вниз, пользователь извлекает старые сообщения, что означает, что вставка этих сообщений должна быть в позиции 0 адаптера, а не последовательно, как это делает библиотека подкачки. Как я могу чередовать положение вставленных элементов, чтобы они были последовательно для новых сообщений и в позиции 0 для старых сообщений?

2- Из папки «Входящие» (люди, у которых есть сообщения пользователя), снова я использую ItemKeyedDataSource здесь, проблема в том, что я хочу сохранить прослушиватель нескольких документов из репозитория (я использую Firebase Firestore), поэтому Я могу обнаружить каждый раз, когда новый человек говорит с пользователем. Проблема в том, что callback.onResult вызывается только один раз, и происходит сбой, когда Firebase отправляет другого пользователя. Как мне сохранить список с возможностью обновления?

1 Ответ

0 голосов
/ 14 ноября 2018

Я понимаю, что этот ответ, вероятно, слишком поздно, но, возможно, он может помочь кому-то в будущем.

Позиция элемента в RecyclerView определяется положением соответствующего объекта данных (типа T) внутри PagedList . PagedList разработан так, чтобы выглядеть как старый добрый List , но его можно рассматривать как «бесконечный» список элементов.

PagedList получает свои элементы по страницам по запросу через нечто, называемое DataSource.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 > и, наконец, используйте перемещаемый список для отображения сообщений в RecyclerView в приложении чата. Затем, когда вы вставляете, обновляете или удаляете данные внутри БД, эти изменения автоматически распространяются на пользовательский интерфейс. Это может быть очень полезно.

Я рекомендую вам прочитать несколько похожих примеров кода:

...