Descripción general de la biblioteca de Paging   Parte de Android Jetpack.

La biblioteca de Paging te ayuda a cargar y mostrar páginas de datos de un conjunto de datos más grande desde el almacenamiento local o por una red. Este enfoque permite que tu app use el ancho de banda de la red y los recursos del sistema de manera más eficiente. Los componentes de la biblioteca de Paging están diseñados para adaptarse a la arquitectura de apps para Android recomendada, integrarse con facilidad a otros componentes de Jetpack y proporcionar compatibilidad de primer nivel con Kotlin.

Beneficios de usar la biblioteca de Paging

La biblioteca de Paging incluye las siguientes funciones:

  • Almacenamiento en caché en memoria para los datos paginados, que garantiza que tu app use los recursos del sistema de manera eficiente mientras trabaja con datos paginados
  • Anulación integrada de duplicación de solicitudes, que ayuda a garantizar que la app use el ancho de banda de la red y los recursos del sistema de manera eficiente
  • Compatibilidad de primer nivel con las corrutinas y los flujos de Kotlin
  • Compatibilidad integrada para el manejo de errores, incluidas funciones de actualización y reintento

Configuración

Si quieres importar componentes de Paging a tu app para Android, agrega las siguientes dependencias al archivo build.gradle de tu app:

Kotlin

dependencies {
  val paging_version = "3.4.2"

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

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

Groovy

dependencies {
  def paging_version = "3.4.2"

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

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

Arquitectura de biblioteca

Los componentes de la biblioteca de Paging operan en tres capas de tu app:

  • La capa del repositorio
  • La capa ViewModel
  • La capa de la IU
Una imagen que muestra flujos de datos paginados desde los componentes de PagingSource o RemoteMediator en la capa del repositorio hasta el componente de Pager en la capa ViewModel.
    Luego, el componente de Pager expone un flujo de PagingData a los
    componentes de diseño diferido en la capa de la IU.
Figura 1. Ejemplo de cómo la biblioteca de Paging se adapta a la arquitectura de tu app

En esta sección, se describen los componentes de la biblioteca de Paging que operan en cada capa, así como la manera en que funcionan juntos para cargar y mostrar datos paginados.

Capa del repositorio

El componente principal de la biblioteca de paginación en la capa del repositorio es PagingSource. Cada objeto PagingSource define una fuente de datos y la manera en que recuperará los datos de esa fuente. Un objeto PagingSource puede cargar datos desde cualquier fuente única, incluidas fuentes de red y bases de datos locales.

Otro componente de la biblioteca de Paging que puedes usar es RemoteMediator. Un objeto RemoteMediator controla la paginación de una fuente de datos en capas, como una fuente de datos de red con una caché de base de datos local.

Capa ViewModel

El componente Pager proporciona una API pública para crear instancias de PagingData que se exponen en flujos reactivos, basadas en un objeto PagingSource y en un objeto de configuración PagingConfig.

El componente que conecta la capa ViewModel con la IU es PagingData. Un objeto PagingData es un contenedor del resumen de los datos paginados. Busca un objeto PagingSource y almacena el resultado.

Capa de la IU

La API principal de la IU de Paging es collectAsLazyPagingItems(). Expone elementos paginados como una lista de datos que los componentes de diseño diferido de Compose pueden consumir fácilmente, como LazyColumn y LazyRow.

Agrega la biblioteca androidx.paging:paging-compose para usar APIs compatibles con Compose que permitan que la IU reaccione automáticamente a las cargas, actualizaciones y errores de datos sin necesidad de adaptadores ni lógica de diferenciación. Usa la función de extensión collectAsLazyPagingItems() en un Flow<PagingData> para pasar el LazyPagingItems que se muestra a items() en un 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()
            }
        }
    }
}

Para obtener más información, consulta Conjuntos de datos grandes (paginación).