Пагинация
May 26, 2020 · View on GitHub
Пагинация
- Структура данных
- Организация запроса
- Отображение на UI
- Возможные трудности при пагинации
- Пример реализации
Пагинация(постраничная загрузка данных) может быть реализована двумя механизмами:
-
limit-offset - известен размер блока данных и смещение относительно самого первого элемента
-
page-count - известен размер страницы и ее номер.
Выбор какой механизм использовать обусловлен скорее серверной стороной.
Структура данных
Для поддержки пагинации на клиенте предусмотрены структуры данных, предоставляемые одним из следующих модулей:
Организация запроса
Сам пагинируемый запрос ничем не отличается от обычного. Конкретная реализация будет также зависеть от сервера.
Отображение на UI
При пагинации в вертикальных списках и сетках используется футер с состоянием загрузки (лоадером) и состоянием ошибки. Для удобной и быстрой реализации такого списка предусмотрен специальный адаптер из модуля easyadapter.
Возможные трудности при пагинации
При организации пагинации можно столкнуться с некоторыми проблемными случаями.
-
Список с разнородными элементами. Например, список некоторых позиций онлайн-магазина, в который надо включать промоакции. Сложность данной ситуации обусловлена тем, что пагинируемые данные храняться в DataList'ах и только в них. Но эти списки могут не совпадать с отображением на UI.
Возможное решение: использовать для этих элементов разные контроллеры и прогружать список акций заранее. Тогда можно будет распределить акции по списку на UI, не нарушая общий порядок пагинации.
-
При перезагрузке нескольких страниц могут возникнуть определенные проблемы(например со стороны сервера, если на нем стоит ограничение на количество единовременно отдаваемых страниц).
Решение: Использовать утилиты, которые разобьют текущий запрос на блоки по страницам. Такие утилиты есть в каждом модуле с DataList.
-
Чат. Необходимо отобразить наше сообщение, которое только что написали, но - оно еще не получено в списке с сервера.
Возможное решение: использовать еще один временный список для отображения. И для удобства использовать EasyAdapter.
-
Маппинг содержимого DataList в другие типы. Например, у элемента списка на UI может быть состояние выбран/не выбран. Тогда удобно смаппить список, пришедший с сервера, в тип CheckableData (предоставляемый модулем util-ktx).
Решение: Использовать специальный метод внутри DataList.
Пример реализации
Пример реализации пагинируемой загрузки в приложении представлен здесь. Демонстрационный пример с двумя механизмами пагинации здесь.