Пагинация

May 26, 2020 · View on GitHub

Главная

Пагинация

Пагинация(постраничная загрузка данных) может быть реализована двумя механизмами:

  • limit-offset - известен размер блока данных и смещение относительно самого первого элемента

  • page-count - известен размер страницы и ее номер.

Выбор какой механизм использовать обусловлен скорее серверной стороной.

Структура данных

Для поддержки пагинации на клиенте предусмотрены структуры данных, предоставляемые одним из следующих модулей:

Организация запроса

Сам пагинируемый запрос ничем не отличается от обычного. Конкретная реализация будет также зависеть от сервера.

Отображение на UI

При пагинации в вертикальных списках и сетках используется футер с состоянием загрузки (лоадером) и состоянием ошибки. Для удобной и быстрой реализации такого списка предусмотрен специальный адаптер из модуля easyadapter.

Возможные трудности при пагинации

При организации пагинации можно столкнуться с некоторыми проблемными случаями.

  • Список с разнородными элементами. Например, список некоторых позиций онлайн-магазина, в который надо включать промоакции. Сложность данной ситуации обусловлена тем, что пагинируемые данные храняться в DataList'ах и только в них. Но эти списки могут не совпадать с отображением на UI.

    Возможное решение: использовать для этих элементов разные контроллеры и прогружать список акций заранее. Тогда можно будет распределить акции по списку на UI, не нарушая общий порядок пагинации.

  • При перезагрузке нескольких страниц могут возникнуть определенные проблемы(например со стороны сервера, если на нем стоит ограничение на количество единовременно отдаваемых страниц).

    Решение: Использовать утилиты, которые разобьют текущий запрос на блоки по страницам. Такие утилиты есть в каждом модуле с DataList.

  • Чат. Необходимо отобразить наше сообщение, которое только что написали, но - оно еще не получено в списке с сервера.

    Возможное решение: использовать еще один временный список для отображения. И для удобства использовать EasyAdapter.

  • Маппинг содержимого DataList в другие типы. Например, у элемента списка на UI может быть состояние выбран/не выбран. Тогда удобно смаппить список, пришедший с сервера, в тип CheckableData (предоставляемый модулем util-ktx).

    Решение: Использовать специальный метод внутри DataList.

Пример реализации

Пример реализации пагинируемой загрузки в приложении представлен здесь. Демонстрационный пример с двумя механизмами пагинации здесь.