Panoramica della libreria Paging   Parte di Android Jetpack.

La libreria Paging ti aiuta a caricare e visualizzare pagine di dati da un set di dati più grande dall'archiviazione locale o tramite una rete. Questo approccio consente alla tua app di utilizzare in modo più efficiente sia la larghezza di banda di rete sia le risorse di sistema. I componenti della libreria Paging sono progettati per adattarsi all'architettura delle app per Android consigliata, integrarsi perfettamente con altri componenti Jetpack e fornire un supporto di prima classe per Kotlin.

Vantaggi dell'utilizzo della libreria Paging

La libreria Paging include le seguenti funzionalità:

  • Memorizzazione nella cache in memoria per i dati paginati. In questo modo, la tua app utilizza le risorse di sistema in modo efficiente quando lavora con dati impaginati.
  • Deduplicazione delle richieste integrata, che contribuisce a garantire che la tua app utilizzi in modo efficiente la larghezza di banda di rete e le risorse di sistema.
  • Supporto di prima classe per le coroutine e i flussi Kotlin.
  • Supporto integrato per la gestione degli errori, incluse le funzionalità di aggiornamento e riprova.

Configurazione

Per importare i componenti di impaginazione nella tua app per Android, aggiungi le seguenti dipendenze al file build.gradle dell'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")
}

Alla moda

dependencies {
  def paging_version = "3.4.2"

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

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

Architettura della libreria

I componenti della libreria Paging operano in tre livelli dell'app:

  • Il livello del repository
  • Il livello ViewModel
  • Livello UI
Un'immagine che mostra i flussi di dati paginati dai componenti PagingSource o RemoteMediator nel livello del repository al componente Pager nel livello ViewModel.
    Il componente Pager espone quindi un flusso di PagingData ai
    componenti di layout pigro nel livello UI.
Figura 1. Un esempio di come la libreria Paging si inserisce nell'architettura dell'app.

Questa sezione descrive i componenti della libreria Paging che operano in ogni livello e come collaborano per caricare e visualizzare i dati paginati.

Livello repository

Il componente principale della libreria Paging nel livello repository è PagingSource. Ogni oggetto PagingSource definisce un'origine dati e come recuperare i dati da questa origine. Un oggetto PagingSource può caricare dati da qualsiasi singola origine, incluse le origini di rete e i database locali.

Un altro componente della libreria Paging che potresti utilizzare è RemoteMediator. Un oggetto RemoteMediator gestisce la paginazione da un'origine dati a più livelli, ad esempio un'origine dati di rete con una cache di database locale.

Livello ViewModel

Il componente Pager fornisce un'API pubblica per creare istanze di PagingData esposte in flussi reattivi, in base a un oggetto PagingSource e a un oggetto di configurazione PagingConfig.

Il componente che connette lo strato ViewModel alla UI è PagingData. Un oggetto PagingData è un contenitore per uno snapshot dei dati impaginati. Esegue una query su un oggetto PagingSource e memorizza il risultato.

Livello UI

L'API principale dell'interfaccia utente di paginazione è collectAsLazyPagingItems(). Espone gli elementi impaginati come un elenco di dati che possono essere facilmente utilizzati dai componenti di layout pigro di Compose, come LazyColumn e LazyRow.

Aggiungi la libreria androidx.paging:paging-compose per utilizzare API compatibili con Compose che consentono all'interfaccia utente di reagire automaticamente a caricamenti, aggiornamenti ed errori dei dati senza la necessità di adattatori o logica di differenziazione. Utilizza la funzione di estensione collectAsLazyPagingItems() su un Flow<PagingData> per passare LazyPagingItems restituito a items() in 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()
            }
        }
    }
}

Per saperne di più, consulta Set di dati di grandi dimensioni (impaginazione).