Что такое нумерация страниц в Android

Обновлено: 10.08.2022

Разбиение на страницы с помощью Recyclerview позволяет пользователю просматривать последний контент постранично. По мере того, как мы загружаем следующую «страницу», к тому времени, когда пользователи прокручивают страницу вниз, загружается и становится доступным больше контента.

Оглавление

Что такое Recyclerview?

Android RecyclerView — это более продвинутая, мощная и гибкая версия ListView. Android RecyclerView похож на ListView, за исключением того, что он заставляет нас использовать класс RecyclerView.ViewHolder для хранения элементов, которые не являются обязательными в ListView.

Как следует из названия, Android RecyclerView используется для повторного использования ячеек при прокрутке вверх и вниз путем повторного использования элементов в списке. Еще одно улучшение в RecyclerView заключается в том, что он позволяет нам динамически устанавливать LayoutManagers во время выполнения, в отличие от ListView, который был доступен только в списке с вертикальной прокруткой. RecyclerView позволяет нам устанавливать следующие типы макетов во время выполнения.

LinearLayoutManager: поддерживает как вертикальные, так и горизонтальные списки.
StaggeredLayoutManager: поддерживает шахматные списки.
GridLayoutManager: поддерживает отображение сеток, как показано ранее в GalleryView.

Я подробно объяснил recyclerview по ссылке ниже,

Когда использовать нумерацию страниц?

Я уверен, что вы уже хорошо представляете, когда его использовать. Если у вас много контента, который загружается слишком долго. Это может быть либо из локальной базы данных, либо вызов API. Тогда имеет смысл использовать Pagination. Если вы извлекаете данные из базы данных, запрашивайте данные партиями (скажем, по 20 на запрос). То же самое относится и к вызову API.

Теперь с объяснениями покончено. Давайте приступим к написанию кода для пейджинга с помощью recyclerview в Android.

1. Настройка зависимости для разбивки на страницы с помощью recyclerview

Добавить зависимости recyclerview, retrofit и glide в файл app build.gradle.

2. Подготовьте данные для recyclerview

В этом примере я использую разбиение на страницы с модификацией для загрузки данных из REST API.

Добавьте разрешение на доступ в Интернет для своего приложения в AndroidManifest.xml,

Создайте экземпляр Retrofit

Нам нужно создать экземпляр Retrofit для отправки сетевых запросов. нам нужно использовать класс Retrofit Builder и указать базовый URL-адрес для службы.

Настройка интерфейса модификации

@GET, @POST, @PUT, @DELETE, @PATCH или @HEAD.

Конечные точки определяются внутри интерфейса с помощью модифицированных аннотаций для кодирования сведений о параметрах и методе запроса. Возвращаемое значение T всегда является параметризованным вызовом .

В моем ответе JSON есть список фильмов с именами и свойствами. Таким образом, класс «Моя модель» будет похож на класс «Фильм», поскольку имя и имя класса, год, директор являются свойствами.

3. Настройка разбиения на страницы с помощью recyclerview

Сначала добавьте RecyclerView в файл activity_main.xml

Адаптер Recyclerview для разбиения на страницы

Создайте класс PaginationAdapter, расширяющий RecyclerView.Adapter, а затем создайте два класса RecyclerView.ViewHolder.

класс MovieViewHolder() — элементы Recyclerview

class LoadingViewHolder() — ProgressBar нижнего колонтитула, используемый для разбиения на страницы

В этом посте я использую Glide для загрузки данных с URL-адреса.

Чтобы включить нумерацию страниц, мы должны обнаружить, что пользователь достигает конца элементов RecyclerView. Для этого PaginationScrollListener расширяет RecyclerView.OnScrollListener и переопределяет метод onScrolled().

Наконец, добавьте нумерацию страниц с помощью recyclerview, чтобы загружать больше элементов при прокрутке.

Теперь мы реализовали recyclerview с нумерацией страниц.

Вы можете скачать исходный код этого примера на github.

Заключение

Спасибо, что прочитали. Пожалуйста, попробуйте этот пример сами и поделитесь своими впечатлениями в комментариях.


Разбивка на страницы (бесконечная прокрутка или бесконечная прокрутка) – это функция, распространенная в приложениях с большим объемом контента. Он разбивает список контента на равные более мелкие части, загружаемые по одной.

Это первая публикация из серии статей о разбивке на страницы. В этой серии рассказывается, как реализовать разбиение на страницы с помощью RecyclerView, обрабатывать изменения адаптера с новыми данными, обрабатывать ошибки и многое другое.

Эта статья была обновлена ​​для AndroidX!

Обзор серии страниц

  1. Руководство по разбивке на страницы Android: начало работы

Что, почему и когда разбивать на страницы

Разбивка на страницы – это процесс разделения документа на отдельные страницы, будь то электронные или печатные страницы. – Википедия

Уже знаете, что такое нумерация страниц? Сразу переходите к разделу кода!

То, что мы собираемся сделать, относится к этому определению. Загрузка следующего набора данных (следующей страницы), путем указания ее индекса (номера страницы).

Что такое нумерация страниц?

Пользователи Facebook, Twitter или Instagram поймут, о чем я говорю.В конце концов, мы потратили бесчисленное количество часов, просматривая их, не так ли? Кажется, они просто не заканчиваются!

профиль Twitter твиты разбивка на страницы бесконечная прокрутка загрузить еще

Список твитов профиля Twitter

Зачем нумерация страниц?

С точки зрения разработчика, как бы вы загружали весь этот контент? Невозможно сделать звонок для такого огромного контента за один раз. Нам придется запрашивать их частями или «страницами».

Разбивка на страницы позволяет пользователю просматривать новейший контент с минимальным временем ожидания. По мере того, как мы загружаем следующую «страницу», к тому времени, когда пользователи прокручивают страницу вниз, загружается и становится доступным больше контента.

Когда использовать нумерацию страниц?

Я уверен, что вы уже хорошо представляете, когда его использовать. Если у вас много контента, который загружается слишком долго. Это может быть либо из локальной базы данных, либо вызов API. Тогда имеет смысл использовать Pagination. Если вы извлекаете данные из базы данных, запрашивайте данные партиями (скажем, по 20 на запрос). То же самое относится и к вызову API.

СОВЕТ
Хорошие API, работающие с огромным объемом контента, обеспечивают поддержку разбиения на страницы.

После этого я уверен, что вы хотели бы увидеть код Android с нумерацией страниц в действии. Итак, без дальнейших проволочек, давайте сразу к делу!

Начало работы

Как мы все знаем, нумерация страниц существует уже довольно давно. Это открывает различные подходы к тому, как именно это сделать.

Вот некоторые решения, с которыми вы могли столкнуться:

Но они не говорят вам, как показать или скрыть ход загрузки нижнего колонтитула ( ProgressBar ). Вы также могли бы прибегнуть к библиотеке Android Pagination на GitHub:

Обычно я бы предложил что-то из вышеперечисленного, но в этот раз не буду. Это потому, что мы можем свернуть наш собственный прослушиватель прокрутки. Вместо этого было бы проще. Иногда лучше контролировать нашу функцию, особенно когда сторонние решения отказываются работать так, как вы хотите.

Разбиение на страницы Android с помощью RecyclerView

Пользовательский прослушиватель OnScroll

Скопируйте этот класс. Чтобы включить разбивку на страницы, мы должны обнаружить пользователя, достигшего конца списка ( RecyclerView ). PaginationScrollListener позволяет это сделать.

ПРИМЕЧАНИЕ.
Логика onScrolled() — самая важная часть всей логики разбивки на страницы. Поэтому убедитесь, что вы делаете это правильно. Ключевой фрагмент, содержащий логику разбивки на страницы, выглядит следующим образом.

Настройка макета

Создайте макет с помощью RecyclerView и ProgressBar (для индикации загрузки исходного контента).

Для нашего примера предположим, что мы хотим отобразить список фильмов.

ПРИМЕЧАНИЕ
Список (ваши данные) должен находиться только в классе RecyclerView.Adapter. Вы можете получить к нему доступ через Getter Setters.

Вспомогательные методы адаптера

Добавьте следующие методы в PaginationAdapter. Они будут полезны для добавления данных, полученных через разбиение на страницы.

Это все, что касается адаптера. На всякий случай полный код PaginationAdapter доступен здесь.

Подготовка RecyclerView

При внимательном рассмотрении разбиение на страницы работает следующим образом:

  1. Отображать ход загрузки ( ProgressDialog ) на пустом экране во время получения исходных данных.
  2. Скрыть ProgressDialog и отобразить данные
  3. Обнаружение прокрутки пользователем до конца списка
  4. Показывать ProgressDialog в нижнем колонтитуле при получении данных следующей страницы
  5. Удалить нижний колонтитул ProgressDialog и отобразить полученные данные
  6. Повторяйте шаги 3, 4 и 5, пока не загрузятся все страницы.

Обратите внимание, что настройка для определенных шагов уже выполнена. Загрузка исходных данных (страница 0) обработает шаги 1 и 2. PaginationListener обработает шаги 3 и 6. Вспомогательные методы PaginationAdapter обработают шаги 4 и 5.

Следующая настройка кода покажет вам, как все это будет связано друг с другом.

Настройка активности

Вот весь MainActivity.java. Это должно дать вам четкое представление о том, как все взаимосвязано.

Обязательно обратите внимание на переменные здесь. Поскольку каждый из них играет ключевую роль в логике разбивки на страницы. Также помните, что TOTAL_PAGES будет определяться количеством страниц вашего API. Обычно это будет включено в ответ с разбивкой на страницы.

Загрузка исходных данных

Вот как мы будем использовать этот метод для выполнения начальной загрузки (т. е. запроса 1-й страницы):

Мы можем даже имитировать задержку сети, используя Handler.

После того как мы загрузим первоначальный запрос и получим данные, скройте ProgressBar. Затем извлеченные данные добавляются в адаптер и уведомляются. Вспомогательный метод addAll() в PaginationAdapter выполняет это.

ПРИМЕЧАНИЕ
Исходными данными для загрузки является 1-я страница (0-й индекс). Это должен быть отдельный вызов, так как остальные страницы обрабатываются по-разному.

Использование Paginati onScrollListener

Обратите внимание, как PaginationScrollListener использует флаги, определенные нашей активностью. Ему нужен LayoutManager, предоставленный RecyclerView, для подсчета и сравнения количества элементов, которые у него есть. Это более точно, чтобы узнать, сколько элементов на самом деле находится в макете, а не подсчитывать List . Но пока его конструктор поддерживает только LinearLayoutManager .

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

Теперь давайте посмотрим на шаги, которые мы предпринимаем для загрузки страницы 2. Это остается одинаковым для всех страниц, кроме этой.

  1. Получить данные (ответ) от API
  2. Удалите ProgressBar нижнего колонтитула, чтобы освободить место для новых данных.
  3. Указать, что следующая страница в данный момент не загружается (используя isLoading )
  4. Добавьте новые данные в адаптер
  5. Проверьте, не последняя ли это страница. Если нет, добавьте нижний колонтитул ProgressBar

Окончательный результат

Согласно нашей настройке кода, мы создаем 10 фиктивных материалов для каждой загрузки страницы. Количество раз, когда произойдет нумерация страниц, равно 3 (TOTAL_PAGE). Добавьте к этому первоначальную загрузку страницы, и вы увидите в общей сложности 40 элементов.

Запустите приложение.

Отличная работа! Теперь у нас есть работающее приложение для Android с RecyclerView, которое поддерживает разбиение на страницы.

Что дальше?

В этой статье мы изучили логику разбивки наших данных на страницы. Однако это лишь некоторые фиктивные данные. В реальном мире мы получаем данные из API. Итак, если в игре есть сетевые вызовы, как бы вы разбили страницы?

Итак, как вы собираетесь разбивать свои приложения на страницы? Считаете ли вы этот подход хорошим? Или вы имеете в виду что-то лучшее? Оставьте их в комментариях ниже.

Общей функцией является автоматическая загрузка данных по мере того, как пользователь прокручивает элементы (т. е. бесконечная прокрутка). Ранее существовали различные настраиваемые решения, такие как сторонние варианты, которые могли достичь этой цели. Новая библиотека подкачки Google теперь обеспечивает эту поддержку.

Примечание. Руководство по бесконечной прокрутке по-прежнему используется по умолчанию для добавления функции разбивки на страницы в университетские проекты CodePath. Однако библиотека Google Paging становится стандартом для рабочих приложений.

Настройка

Обязательно добавьте репозиторий Google Maven в корневой файл build.gradle:

Затем добавьте библиотеки Paging и LiveData в ваше приложение/build.gradle:

Изменение RecyclerView

Библиотеку подкачки можно использовать только с RecyclerView. Если вы используете ListView для отображения своих списков, вы должны сначала перейти на использование шаблона ViewHolder перед переходом на RecyclerView. При переходе на RecyclerView также может потребоваться изменить способ обработки кликов.

Изменение в ListAdapter

После того как ваши списки будут использовать RecyclerView, следующим шагом будет изменение адаптеров для наследования от класса ListAdapter, а не от класса RecyclerView.Adapter. Дополнительную информацию см. в этом руководстве.

Переход к PagedListAdapter

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

Кроме того, адаптер больше не должен сохранять копию своего текущего списка. Вместо этого следует использовать метод getItem().

Добавить источник данных

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

  • ItemKeyedDataSource — предоставляет некоторый тип ключа, который можно использовать для получения следующего размера данных и неизвестного размера списка (см. пример Twitter ниже).
  • PageKeyedDataSource — предоставляет ссылку "следующая/перед" и имеет неизвестный размер списка (пример: Facebook Graph API)
  • PositionalDataSource – полезно для источников, предоставляющих список фиксированного размера, который можно получить с произвольными позициями и размерами (см. пример синтаксического анализа)

Использование ItemKeyedDataSource

API Twitter предоставляет пример того, как ItemKeyedDataSource. Размер списка неизвестен, и обычно получение следующего набора данных зависит от последнего известного идентификатора сообщения в Твиттере. Идентификатор последнего сообщения можно использовать для получения следующего набора сообщений благодаря параметру max_id в Twitter API:

Первым шагом является определение ключа, который будет использоваться для определения следующей страницы данных. ItemKeyedDataSource в приведенном ниже примере будет использовать тип Long и полагаться на идентификатор сообщения Twitter. Идентификатор последнего увиденного сообщения будет использоваться для получения следующего набора данных.

Далее нам нужно определить внутри источника данных функции loadInitial() и loadAfter() .

Метод createTweetHandler() анализирует данные JSON и отправляет данные в адаптер RecyclerView и обработчик PagedList. Имейте в виду, что все эти сетевые вызовы уже выполняются в фоновом потоке, поэтому сетевой вызов должен выполняться синхронно:

Добавить фабрику источников данных

Фабрика источников данных просто создает источник данных. Из-за зависимости от клиента Twitter нам нужно передать его и здесь:

Создание списка страниц

После того как мы создали источник данных и фабрику источников данных, последним шагом будет создание PagedList и прослушивание обновлений. Затем мы можем вызвать submitList() на нашем адаптере со следующим набором данных:

Добавление нескольких источников данных

Библиотека подкачки требует, чтобы данные, используемые в RecyclerView, независимо от того, извлекаются ли они из сети, базы данных или памяти, были определены как источники данных. Это также обеспечивает гибкость: сначала извлекать данные из базы данных или памяти, а если данных больше нет, извлекать дополнительные сегменты данных из сети. Чтобы продемонстрировать, как работает библиотека подкачки, вы также можете попробовать этот пример кода из Google.

Использование с SwipeRefreshLayout

Чтобы использовать библиотеку подкачки с SwipeRefreshLayout, нам нужно сделать недействительным источник данных для принудительного обновления. Для этого нам сначала нужна ссылка на источник данных. Мы можем сделать это, создав экземпляр MutableLiveData, который поддерживает жизненный цикл и будет содержать это значение.

Далее нам нужно переместить TweetDataSourceFactory, чтобы он стал доступным:

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

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

В этом блоге мы изучим нумерацию страниц в RecyclerView для Android. В основном приложение требует функции разбивки на страницы в собственных приложениях для Android. В частности, в приложениях для социальных сетей, таких как Twitter, Facebook, Instagram и т. д. В этом примере RecyclerView для Android с разбиением на страницы мы создадим собственный набор адаптеров в RecyclerView, как показано ниже.

Введение

Разбиение на страницы в Android сегодня является очень распространенной функцией для приложений с большим объемом данных. Это также называется бесконечной прокруткой или бесконечной прокруткой. Вы хотите получить все данные канала сразу и связать с представлением, что может занять много времени, и ваше приложение будет работать медленно. Разбиение на страницы используется для лучшего взаимодействия с пользователем и управления ресурсами. Он разбил список контента на равные более мелкие части, загружаемые по одной.

В этом руководстве мы реализуем разбиение на страницы с помощью RecyclerView, обработку изменений адаптера с новыми данными, обработку ошибок и многое другое.

Обзор страниц

  • Необходимость нумерации страниц
  • Создать и настроить проект
  • Создание представлений элементов списка
  • Напишите адаптер RecyclerView и расширьте представление элемента строки.
  • Установите адаптер в RecyclerView с помощью SwipeRefreshLayout
  • Последний шаг — установка прослушивателя прокрутки страниц RecyclerView.

Необходимость нумерации страниц

Ежедневно вы используете множество приложений для разбивки на страницы. например. Фейсбук, Твиттер и Инстаграм. Когда вы прокручиваете этот список и достигаете конца представления, загружаются дополнительные элементы.

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

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

Разбиение на страницы в Android RecyclerView (демонстрационное приложение для Android с разбиением на страницы)

1. Создать и настроить проект

  • В Android Studio перейдите в меню "Файл" -> "Создать новый проект" -> заполните все необходимые данные, выберите шаблон EmptyActivity и нажмите "Готово".
  • Откройте проект build.gradle и добавьте ниже зависимости для RecyclerView, CardView и ButterKnife.
  • Android Studio создает два файла макета для каждого действия. Для MainActivity также создан файл activity_main.xml. В основное действие добавьте RecyclerView вместе с компонентом SwipeRefreshLayout. SwipeRefreshLayout, который мы используем для функции извлечения для обновления.

2. Создание представлений элементов списка

Создайте макет XML с именем item_post.xml внутри res в папке макета. Этот файл макета будет отвечать за отображение одной строки в представлении переработчика, которая содержит заголовок, определение и время публикации.

3. Создайте POJO для хранения данных просмотра

Создайте новый класс POJO для хранения данных элемента записи с именем PostItem.java и объявите заголовок, описание и время. Также добавьте методы получения/установки для каждой переменной.

4. Написание класса BaseViewHolder.java для ViewHolder RecyclerView

BaseViewHolder — это вспомогательный класс, отвечающий за более простое управление несколькими держателями представлений. Мне написали отдельную статью о рекомендациях RecyclerView в Android

5. Напишите адаптер RecyclerView для привязки представления

Давайте создадим класс адаптера с именем PostRecyclerAdapter.java и следующую настройку, которую мы должны выполнить для разбиения на страницы

  • Создайте два класса ViewHolder для ProgressHolder и ViewHolder
  • Здесь метод onCreateViewHolder() создает два представления. Первое представление для VIEW_TYPE_NORMAL, которое расширяет item_post.xml, а второе для VIEW_TYPE_LOADING — это расширение item_loading.xml
  • getItemViewType() — возвращаемый тип представления для каждой позиции на основе этого макета. если загрузчик виден и позиция элемента равна размеру списка, верните VIEW_TYPE_LOADING, иначе VIEW_TYPE_NORMAL )
  • Добавление и удаление элементов в списке с помощью метода addItems() или clear()
  • Последние и важные вещи — это добавление и удаление загрузчика в адаптере.

Загрузка макета — item_loading.xml

6. Создайте имя класса PaginationScrollListener

PaginationScrollListener — это служебный класс Java, который расширяет RecyclerView.OnScrollListener. Теперь необходимо определить здесь PAGE_SIZE и некоторые полезные методы, такие как loadMoreItems(), isLastPage() и isLoading(), все используемые методы объясняются позже

7. Теперь откройте MainActivity.java и внесите указанные ниже изменения.

  • Здесь метод подготовленногоListItem() добавляет образец данных в представление списка.
  • Инициализация PostRecyclerAdapter и установка в RecyclerView
  • Добавьте addOnScrollListener() поверх RecyclerView, пока пользователь прокручивает список до конца, метод loadMoreItems() и следующая страница будут загружены.
  • Установите setOnRefreshListener() в объекте SwipeRefreshLayout, пока пользователь будет вызывать методы RecyclerView onRefresh().

В этом примере приложения методы doApiCall() не вызывают никакого API. Но в то время как в реальной реализации вам нужно получать данные с удаленного сервера, поэтому поместите весь код метода run() в Успех API

Окончательный код такой. Давайте запустим проект и подтвердим ваши действия. Если все хорошо, прокрутка работает отлично.

Заключение

Вот и все. В этом руководстве мы узнали о реализации Разбиение на страницы в RecyclerView. Я надеюсь, что это будет полезно для вас. Помогите мне, поделившись этой записью со всеми своими друзьями, которые изучают разработку приложений для Android.

Оставайтесь на связи

Если у вас есть какие-либо вопросы, не стесняйтесь задавать их в разделе комментариев ниже.


Многие разработчики до сих пор избегают использования Epoxy. Я даже долго колебался из-за того, что в шаблоне слишком много эпоксидной смолы и ее моделей, но самое позднее, прочитав этот пост, вы можете подумать об использовании эпоксидной смолы, когда необходимо разбиение по страницам.

Итак, в этом посте мы создадим пагинацию с помощью библиотеки пейджинга реактивного ранца и эпоксидной смолы, у которой есть собственный контроллер для пейджинга.

Мы будем использовать Reddit в качестве нашего API, просто добавив .json в конце URL-адреса субреддита.

Сначала нам нужно реализовать источник данных из компонентов архитектуры, что поможет нам позже загружать наши данные в виде PagedList.

Существуют (на данный момент) следующие параметры в качестве источника данных:

PageKeyedDataSource: если в вашем ответе есть какие-то поля до и/или после, чтобы загрузить предыдущую/следующую страницу

ItemKeyedDataSource: если вам нужен ключ вашего последнего элемента для загрузки следующей страницы

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

В нашем руководстве мы будем использовать PageKeyedDataSource, потому что ответ API Reddit предоставляет нам правильные поля до и после, но мы также можем использовать ItemKeyedDatasource, где поле после нашего последнего элемента будет нашим ключом для следующая загрузка.

После реализации нашего источника данных нам понадобится фабрика для предоставления данных для создания LiveData . Если вы используете Room, вы можете захотеть загрузить свои данные из Dao уже как Datasource.Factory.

Это короткий класс в виде одиночного кинжала, в котором мы должны реализовать функцию create(), чтобы обеспечить наш источник данных в приложении.

Поскольку мы подготовили фабрику источников данных, мы можем внедрить ее в нашу модель представления и инициализировать наши LiveData с помощью LivePagedListBuilder. Этот построитель можно использовать с PagedList.Config для настройки некоторых параметров загрузки или просто передать только размер загружаемой страницы в виде целого числа.

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

Наконец, нам нужно реализовать PagedListEpoxyController.

Мы сделали это. Наши LiveData готовы к наблюдению, и единственное, что нужно нашему эпоксидному контроллеру, это PagedList из нашего LiveData… Итак, давайте объединим эту пару:

Внимание: для каждой сборки из LiveData будет получен только один PagedList. Так что не удивляйтесь (как я), почему вы не получаете здесь каждую страницу :)

Это означает, что мы не увидим ~ страниц ~ из списка в нашем коде.Это работа PagedList и Epoxycontroller, и это больше не наше дело.

Кстати, если вы хотите перезагрузить данные, просто аннулируйте источник данных PagedList.

Читайте также: