Visão geral da Paging Library   Parte do Android Jetpack.

A biblioteca Paging ajuda a carregar e mostrar páginas de um conjunto de dados maior do armazenamento local ou da rede. Essa abordagem permite que o app use a largura de banda da rede e os recursos do sistema de modo mais eficiente. Os componentes da biblioteca Paging foram projetados para se ajustar à arquitetura de apps Android recomendada, integrar-se de forma limpa a outros componentes do Jetpack e fornecer suporte de alto nível ao Kotlin.

Benefícios do uso da biblioteca Paging

A biblioteca Paging inclui os seguintes recursos:

  • Armazenamento em cache na memória dos dados paginados. Isso garante que seu app use recursos do sistema de maneira eficiente enquanto trabalha com dados paginados.
  • Eliminação de duplicação de solicitações incorporadas, o que ajuda a garantir que seu app use a largura de banda da rede e os recursos do sistema de forma eficiente.
  • Suporte de alto nível a corrotinas e fluxos do Kotlin.
  • Compatibilidade integrada com tratamento de erros, incluindo recursos de atualização e repetição.

Configuração

Para importar componentes da biblioteca Paging para seu app Android, adicione as seguintes dependências ao arquivo build.gradle do 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"
}

Arquitetura da biblioteca

Os componentes da biblioteca Paging operam em três camadas do app:

  • Camada de repositório
  • Camada ViewModel
  • Camada da interface
Uma imagem mostrando fluxos de dados paginados dos componentes PagingSource ou RemoteMediator na camada do repositório ao componente Pager na camada ViewModel.
    Em seguida, o componente Pager expõe um fluxo de PagingData aos
    componentes de layout lazy na camada da interface.
Figura 1. Um exemplo de como a biblioteca Paging se encaixa na arquitetura do app.

Esta seção descreve os componentes da biblioteca Paging que operam em cada camada e como eles funcionam juntos para carregar e exibir dados paginados.

Camada de repositório

O principal componente da biblioteca Paging na camada de repositório é PagingSource. Cada objeto PagingSource define uma fonte de dados e como recuperar dados dela. Um objeto PagingSource pode carregar dados de uma única fonte, incluindo fontes de rede e bancos de dados locais.

Outro componente da biblioteca Paging que você pode usar é RemoteMediator. Um objeto RemoteMediator processa a paginação de uma fonte de dados em camadas, como uma fonte de dados de rede com um cache de banco de dados local.

Camada ViewModel

O componente Pager fornece uma API pública para criar instâncias de PagingData que são expostas em fluxos reativos, com base em um objeto PagingSource e em um objeto de configuração PagingConfig.

O componente que conecta a camada ViewModel à IU é PagingData. Um objeto PagingData é um contêiner para um snapshot de dados paginados. Ele consulta um objeto PagingSource e armazena o resultado.

Camada de IU

A principal API da interface do usuário de paginação é collectAsLazyPagingItems(). Ele expõe itens paginados como uma lista de dados que podem ser facilmente consumidos pelos componentes de layout lazy do Compose, como LazyColumn e LazyRow.

Adicione a biblioteca androidx.paging:paging-compose para usar APIs compatíveis com o Compose que permitem que a interface reaja automaticamente a cargas, atualizações e erros de dados sem a necessidade de adaptadores ou lógica de diferenciação. Use a função de extensão collectAsLazyPagingItems() em um Flow<PagingData> para transmitir o LazyPagingItems retornado para items() em um 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 mais informações, consulte Conjuntos de dados grandes (paginação).