Обзор библиотеки для страничной навигации. Часть Android Jetpack .

Библиотека Paging помогает загружать и отображать страницы данных из большого набора данных из локального хранилища или по сети. Такой подход позволяет вашему приложению более эффективно использовать как пропускную способность сети, так и системные ресурсы. Компоненты библиотеки Paging разработаны таким образом, чтобы соответствовать рекомендуемой архитектуре приложений Android , чисто интегрироваться с другими компонентами Jetpack и обеспечивать первоклассную поддержку Kotlin.

Преимущества использования библиотеки Paging

Библиотека «Панельная навигация» включает в себя следующие функции:

  • Кэширование в оперативной памяти для ваших постраничных данных. Это помогает обеспечить эффективное использование системных ресурсов вашим приложением при работе с постраничными данными.
  • Встроенная функция дедупликации запросов помогает обеспечить эффективное использование пропускной способности сети и системных ресурсов вашим приложением.
  • First-class support for Kotlin coroutines and flows.
  • Встроенная поддержка обработки ошибок, включая функции обновления и повторной попытки.

Настраивать

Чтобы импортировать компоненты пагинации в ваше Android-приложение, добавьте следующие зависимости в файл build.gradle вашего приложения:

Котлин

dependencies {
  val paging_version = "3.4.2"

  implementation("androidx.paging:paging-common:$paging_version")

  // Jetpack Compose integration
  implementation("androidx.paging:paging-compose:$paging_version")
}

Классный

dependencies {
  def paging_version = "3.4.2"

  implementation "androidx.paging:paging-common:$paging_version"

  // Jetpack Compose integration
  implementation "androidx.paging:paging-compose:$paging_version"
}

архитектура библиотеки

Компоненты библиотеки Paging работают на трех уровнях вашего приложения:

  • Уровень репозитория
  • Слой ViewModel
  • Слой пользовательского интерфейса
Изображение, демонстрирующее потоки постраничных данных от компонентов PagingSource или RemoteMediator в слое репозитория к компоненту Pager в слое ViewModel. Затем компонент Pager предоставляет поток PagingData компонентам ленивой компоновки в слое пользовательского интерфейса.
Рисунок 1. Пример того, как библиотека Paging вписывается в архитектуру вашего приложения.

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

Уровень репозитория

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

Ещё один компонент библиотеки для работы с постраничной навигацией, который вы можете использовать, — это RemoteMediator . Объект RemoteMediator обрабатывает постраничную навигацию из многоуровневого источника данных, например, сетевого источника данных с локальным кэшем базы данных.

слой ViewModel

Компонент Pager предоставляет публичный API для создания экземпляров PagingData , которые отображаются в реактивных потоках, на основе объекта PagingSource и объекта конфигурации PagingConfig .

Компонентом, связывающим слой ViewModel с пользовательским интерфейсом, является PagingData . Объект PagingData представляет собой контейнер для снимка данных, разбитых на страницы. Он запрашивает объект PagingSource и сохраняет результат.

слой пользовательского интерфейса

Основной API для постраничной навигации — это collectAsLazyPagingItems() . Он предоставляет элементы постраничной навигации в виде списка данных, которые легко могут быть использованы компонентами ленивой компоновки Compose, такими как LazyColumn и LazyRow .

Добавьте библиотеку androidx.paging:paging-compose чтобы использовать совместимые с Compose API, позволяющие пользовательскому интерфейсу автоматически реагировать на загрузку данных, обновления и ошибки без необходимости использования адаптеров или логики сравнения. Используйте функцию расширения collectAsLazyPagingItems() в Flow<PagingData> , чтобы передать возвращаемые LazyPagingItems в items() в LazyColumn .

@Composable
fun MessageList(pager: Pager<Int, Message>) {
    val lazyPagingItems = pager.flow.collectAsLazyPagingItems()

    LazyColumn {
        items(
            lazyPagingItems.itemCount,
            key = lazyPagingItems.itemKey { it.id }
        ) { index ->
            val message = lazyPagingItems[index]
            if (message != null) {
                MessageRow(message)
            } else {
                MessagePlaceholder()
            }
        }
    }
}

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

{% verbatim %} {% endverbatim %} {% verbatim %} {% endverbatim %}