Это руководство основано на обзоре библиотеки Paging. В нем описывается, как можно представлять списки информации пользователям в пользовательском интерфейсе вашего приложения, особенно когда эта информация меняется.
Подключите пользовательский интерфейс к модели представления
Вы можете подключить экземпляр LiveData<PagedList> к PagedListAdapter, как показано в следующем фрагменте кода:
Kotlin
class ConcertActivity : AppCompatActivity() { private val adapter = ConcertAdapter() // Use the 'by viewModels()' Kotlin property delegate // from the activity-ktx artifact private val viewModel: ConcertViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState); viewModel.concerts.observe(this, Observer { adapter.submitList(it) }) } }
Java
public class ConcertActivity extends AppCompatActivity { private ConcertAdapter adapter = new ConcertAdapter(); private ConcertViewModel viewModel; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); viewModel = new ViewModelProvider(this).get(ConcertViewModel.class); viewModel.concertList.observe(this, adapter::submitList); } }
Когда источники данных предоставляют новые экземпляры PagedList, действие отправляет эти объекты адаптеру. Реализация PagedListAdapter определяет, как вычисляются обновления, и автоматически обрабатывает разбиение на страницы и сравнение списков. Поэтому ваш ViewHolder должен быть привязан только к определенному предоставленному элементу:
Kotlin
class ConcertAdapter() : PagedListAdapter<Concert, ConcertViewHolder>(DIFF_CALLBACK) { override fun onBindViewHolder(holder: ConcertViewHolder, position: Int) { val concert: Concert? = getItem(position) // Note that "concert" is a placeholder if it's null. holder.bindTo(concert) } companion object { private val DIFF_CALLBACK = ... // See Implement the diffing callback section. } }
Java
public class ConcertAdapter extends PagedListAdapter<Concert, ConcertViewHolder> { protected ConcertAdapter() { super(DIFF_CALLBACK); } @Override public void onBindViewHolder(@NonNull ConcertViewHolder holder, int position) { Concert concert = getItem(position); // Note that "concert" can be null if it's a placeholder. holder.bindTo(concert); } private static DiffUtil.ItemCallback<Concert> DIFF_CALLBACK = ... // See Implement the diffing callback section. }
PagedListAdapter обрабатывает события загрузки страницы с помощью объекта PagedList.Callback. Когда пользователь прокручивает страницу, PagedListAdapter вызывает PagedList.loadAround(), чтобы сообщить PagedList, какие элементы нужно получить из DataSource.
Реализуйте обратный вызов для сравнения
В примере ниже показана реализация метода areContentsTheSame() вручную, при которой сравниваются поля соответствующих объектов.
Kotlin
private val DIFF_CALLBACK = object : DiffUtil.ItemCallback<Concert>() { // The ID property identifies when items are the same. override fun areItemsTheSame(oldItem: Concert, newItem: Concert) = oldItem.id == newItem.id // If you use the "==" operator, make sure that the object implements // .equals(). Alternatively, write custom data comparison logic here. override fun areContentsTheSame( oldItem: Concert, newItem: Concert) = oldItem == newItem }
Java
private static DiffUtil.ItemCallback<Concert> DIFF_CALLBACK = new DiffUtil.ItemCallback<Concert>() { @Override public boolean areItemsTheSame(Concert oldItem, Concert newItem) { // The ID property identifies when items are the same. return oldItem.getId() == newItem.getId(); } @Override public boolean areContentsTheSame(Concert oldItem, Concert newItem) { // Don't use the "==" operator here. Either implement and use .equals(), // or write custom data comparison logic here. return oldItem.equals(newItem); } };
Поскольку адаптер включает ваше определение сравнения элементов, он автоматически обнаруживает изменения в этих элементах при загрузке нового объекта PagedList. В результате адаптер запускает эффективную анимацию элементов в объекте RecyclerView.
Сравнение с использованием другого типа адаптера
Если вы решите не наследовать от PagedListAdapter, например, когда вы используете библиотеку, которая предоставляет собственный адаптер, вы все равно можете использовать функцию сравнения адаптера библиотеки Paging, работая непосредственно с объектом AsyncPagedListDiffer.
Добавьте плейсхолдеры в интерфейс
Если вы хотите, чтобы в интерфейсе отображался список до того, как приложение завершит получение данных, вы можете показать пользователям элементы списка-плейсхолдера. PagedList обрабатывает этот случай, представляя данные о товаре элемента списка как null, пока данные не будут загружены.
У плейсхолдеров есть следующие преимущества:
- Поддержка полос прокрутки.
PagedListпередает количество элементов списка вPagedListAdapter. Эта информация позволяет адаптеру нарисовать полосу прокрутки, которая передает полный размер списка. При загрузке новых страниц полоса прокрутки не прыгает, потому что размер списка не меняется. - Индикатор загрузки не нужен. Поскольку размер списка уже известен, нет необходимости предупреждать пользователей о загрузке дополнительных элементов. Плейсхолдеры сами передают эту информацию.
Прежде чем добавлять поддержку плейсхолдеров, учтите следующие условия:
- Требуется исчисляемый набор данных. Экземпляры
DataSourceиз библиотеки персистентности Room могут эффективно подсчитывать свои элементы. Однако если вы используете собственное решение для локального хранения или архитектуру данных, работающую только по сети, определить количество элементов в наборе данных может быть сложно или даже невозможно. - Адаптер должен учитывать незагруженные элементы. Адаптер или механизм представления, который вы используете для подготовки списка к заполнению, должен обрабатывать пустые элементы списка. Например, при привязке данных к
ViewHolderнеобходимо указать значения по умолчанию, которые будут представлять незагруженные данные. - Требуются элементы одинакового размера. Если размер элементов списка может меняться в зависимости от их контента, например обновлений в социальных сетях, перекрестное затухание между элементами выглядит не очень хорошо. В этом случае мы настоятельно рекомендуем отключить плейсхолдеры.
Отправить отзыв
Вы можете поделиться с нами своими отзывами и идеями, используя следующие ресурсы:
- Система отслеживания ошибок

- Сообщайте о проблемах, чтобы мы могли их устранить.
Дополнительные ресурсы
Чтобы узнать больше о библиотеке Paging, ознакомьтесь со следующими ресурсами.
Образцы
Практические работы
Видео
- Android Jetpack: управление бесконечными списками с помощью RecyclerView и Paging (Google I/O, 2018 г.)
- Android Jetpack: Paging
Рекомендуем
- Примечание. Текст ссылки показывается, когда JavaScript отключен.
- Обзор библиотеки Paging 2
- Переход на Paging 3
- Сбор данных со страниц