Paging

A biblioteca Paging facilita o carregamento gradual e tranquilo de dados na RecyclerView do seu app.

Esta tabela lista todos os artefatos no grupo androidx.paging.

Artefato Versão estável Versão candidata a lançamento Versão Beta Versão Alfa
paging-* 3.2.1 - - 3.3.0-alpha03
paging-compose 3.2.1 - - 3.3.0-alpha03
Esta biblioteca foi atualizada pela última vez em 7 de fevereiro de 2024

Declarar dependências

Para adicionar uma dependência à Paging, é preciso adicionar o repositório Maven do Google ao seu projeto. Leia Repositório Maven do Google para ver mais informações.

Adicione as dependências dos artefatos necessários no arquivo build.gradle para seu app ou módulo:

Groovy

dependencies {
  def paging_version = "3.2.1"

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

  // alternatively - without Android dependencies for tests
  testImplementation "androidx.paging:paging-common:$paging_version"

  // optional - RxJava2 support
  implementation "androidx.paging:paging-rxjava2:$paging_version"

  // optional - RxJava3 support
  implementation "androidx.paging:paging-rxjava3:$paging_version"

  // optional - Guava ListenableFuture support
  implementation "androidx.paging:paging-guava:$paging_version"

  // optional - Jetpack Compose integration
  implementation "androidx.paging:paging-compose:3.3.0-alpha03"
}

Kotlin

dependencies {
  val paging_version = "3.2.1"

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

  // alternatively - without Android dependencies for tests
  testImplementation("androidx.paging:paging-common:$paging_version")

  // optional - RxJava2 support
  implementation("androidx.paging:paging-rxjava2:$paging_version")

  // optional - RxJava3 support
  implementation("androidx.paging:paging-rxjava3:$paging_version")

  // optional - Guava ListenableFuture support
  implementation("androidx.paging:paging-guava:$paging_version")

  // optional - Jetpack Compose integration
  implementation("androidx.paging:paging-compose:3.3.0-alpha03")
}

Para mais informações sobre o uso de extensões Kotlin, consulte a documentação do Android KTX.

Para ver mais informações sobre dependências, consulte Adicionar dependências de build.

Feedback

Seu feedback ajuda a melhorar o Jetpack. Avise se você descobrir novos problemas ou tiver ideias para melhorar esta biblioteca. Consulte os problemas conhecidos nesta biblioteca antes de criar um novo. Adicione seu voto a um problema clicando no botão de estrela.

Criar novo problema

Consulte a documentação do Issue Tracker para saber mais.

Versão 3.3

Versão 3.3.0-alpha03

7 de fevereiro de 2024

Lançamento de androidx.paging:paging-*:3.3.0-alpha03. A versão 3.3.0-alpha03 contém estas confirmações.

Novos recursos

  • PagingDataPresenter agora é uma classe pública. Apresentadores multiplataforma agora podem ser criados com base no PagingDataPresenter, em vez de exigir APIs internas da Paging ou o AsyncPagingDataDiffer do paging-runtime (Id1f74, b/315214786).
  • Foram adicionados novos métodos auxiliares LoadStates e CombinedLoadStates para verificar se LoadStates está no estado "Erro" ou "NotLoading". Também foi adicionada uma nova API que aguarda em um LoadStateFlow até que um carregamento esteja no estado NotLoading ou Error (Id6c67).

Mudança de comportamento

  • PagingData.empty() agora envia estados NotLoading por padrão, a menos que LoadStates personalizados sejam transmitidos para o construtor Isso difere do comportamento existente em que ele não envia LoadStates quando enviado a um PagingDataAdapter ou envia estados de carregamento quando coletado como LazyPagingItems Quando coletado como LazyPagingItems, ela também vai mostrar uma lista vazia imediatamente após a composição inicial (I4d11d, b/301833847).

Versão 3.3.0-alpha02

20 de setembro de 2023

Lançamento de androidx.paging:paging-*:3.3.0-alpha02. A versão 3.3.0-alpha02 contém estas confirmações.

Compatibilidade com o Kotlin multiplataforma

A Paging agora envia artefatos compatíveis com o Kotlin Multiplatform, graças em grande parte ao trabalho upstream do projeto multiplatform-Paging do CashApp. Isso nos permitirá evitar divergências entre dois repositórios e mantê-los compatíveis.

  • paging-common moveu todas as APIs Paging 3 para common e agora é compatível com jvm, iOS e Android.
  • O paging-testing moveu o código para common e agora é compatível com jvm e iOS, além de Android.
  • O paging-compose moveu o código para common e envia um artefato Android, correspondente ao suporte multiplataforma de androidx.compose.
  • paging-runtime, paging-guava, paging-rxjava2 e paging-rxjava3 vão continuar sendo apenas Android.

Mudanças na API

  • A interface pública Logger, que era destinada apenas ao uso interno, foi descontinuada (I16e95, b/288623117).

Contribuição externa

Versão 3.3.0-alpha01

20 de setembro de 2023

  • Essa é a primeira versão multiplataforma das bibliotecas androidx.Paging. Esta versão tem apenas artefatos *-jvm e *-android. Para variantes macOS, iOS e Linux, use 3.3.0-alpha02.

Versão 3.2

Versão 3.2.1

6 de setembro de 2023

Lançamento de androidx.paging:paging-*:3.2.1. A versão 3.2.1 contém estas confirmações.

Correções de bugs

  • Foi corrigido um problema em que a API asSnapshot() do artefato Paging Testing ficava travada ao transmitir um fluxo criado usando PagingData.from(List), já que asSnapshot() não teria nenhuma informação sobre quando o carregamento terminava (ao contrário da sobrecarga PagingData.from(List, LoadStates)). Essa solução só funciona para fluxos completáveis (por exemplo, um flowOf(PagingData.from(...))). Para fluxos não completáveis (por exemplo, MutableStateFlow, use a sobrecarga PagingData.from que fornece LoadStates (I502c3).
  • A Paging Compose agora usa AndroidUiDispatcher.Main internamente para garantir que novos dados estejam disponíveis no mesmo frame após a conclusão do carregamento. (Ia55af).

Versão 3.2.0

26 de julho de 2023

Lançamento de androidx.paging:paging-*:3.2.0. A versão 3.2.0 contém estas confirmações.

Mudanças importantes desde a versão 3.1.0

  • A Paging Compose alcançou a estabilidade da API e foi mesclada ao restante da Paging, em que a versão agora corresponde a todos os outros artefatos dela. Estas são as mudanças desde a versão 3.1.0:
    • Suporte à visualização de uma lista de dados falsos criando um PagingData.from(fakeData) e unindo esse PagingData em um MutableStateFlow (por exemplo, MutableStateFlow(PagingData.from(listOf(1, 2, 3)))). Transmita esse fluxo aos elementos combináveis @Preview como receptor para que o collectAsLazyPagingItems() visualize.
    • Suporte a todos os layouts lentos, como LazyVerticalGrid e HorizontalPager, bem como a componentes lentos personalizados das bibliotecas Wear e TV. Isso foi possível usando os novos métodos de extensão de nível inferior LazyPagingItems itemKey e itemContentType, que ajudam a implementar os parâmetros key e contentType para as APIs items padrão que já existem para LazyColumn, LazyVerticalGrid e os equivalentes em APIs como HorizontalPager.
    • O uso de items(lazyPagingItems) e itemsIndexed(lazyPagingItems), que só oferecem suporte a LazyListScope, foi descontinuado.
  • Novo artefato paging-testing, que fornece APIs projetadas para testar unidades em cada camada do app e a integração com a Paging de forma isolada. Por exemplo, ele inclui
    • A classe TestPager, que permite validar o comportamento da sua implementação personalizada de PagingSource independentemente do Pager e da interface real.
    • APIs asPagingSourceFactory para transformar uma Flow<List<Value>> ou uma List<Value> estática em um PagingSourceFactory que pode ser transmitido para um pager em testes.
    • Extensão Kotlin asSnapshot em Flow<PagingData<Value>>, que converte o Flow<PagingData<Value>> em um List<Value> direto. O asSnapshot lambda permite imitar a IU do app usando APIs como scrollTo ou appendScrollWhile, para que você possa verificar se o snapshot dos dados está correto a qualquer momento no conjunto de dados paginados.
  • Foram adicionados registros padrão para expor informações de depuração da Paging em dois níveis: VERBOSE e DEBUG. Os registros podem ser ativados com o comando adb shell setprop log.tag.Paging [DEBUG|VERBOSE]. Isso se aplica à Paging com visualizações ou à Paging com Compose.
  • Adição de construtores para PagingDataAdapter e AsyncPagingDataDiffer, que aceitam CoroutineContext em vez de CoroutineDispatcher
  • Foi adicionada uma nova interface funcional PagingSourceFactory que fornece uma superfície de API mais explícita do que as lambdas () -> PagingSource anteriores. Essa fábrica pode ser usada para instanciar um Pager.

Versão 3.2.0-rc01

21 de junho de 2023

Lançamento de androidx.paging:paging-*:3.2.0-rc01. A versão 3.2.0-rc01 contém estas confirmações.

Contribuição externa

  • Agradecemos a Veyndan (link em inglês) por contribuir para remover a Paging das especificações do Android/JVM (553, 554, 555 e 559).

Versão 3.2.0-beta01

7 de junho de 2023

Lançamento de androidx.paging:paging-*:3.2.0-beta01. A versão 3.2.0-beta01 contém estas confirmações.

Paging Compose

  • A Paging Compose alcançou oficialmente a estabilidade da API. Dessa forma, a versão foi atualizada de 1.0.0-alpha20 para corresponder à versão de todos os outros artefatos da Paging.

Mudanças na API

Versão 3.2.0-alpha06

24 de maio de 2023

Lançamento de androidx.paging:paging-*:3.2.0-alpha06. A versão 3.2.0-alpha06 contém estas confirmações.

Novos recursos

  • Foi adicionada uma nova interface funcional PagingSourceFactory que fornece uma superfície de API mais explícita do que as lambdas () -> PagingSource existentes Essa fábrica pode ser usada para instanciar um Pager. (I33165, b/280655188).
  • Adição da nova API paging-testing de List<Value>.asPagingSourceFactory() para receber um PagingSourceFactory que só é carregado de uma lista imutável de dados A extensão atual no Flow<List<Value>> ainda precisa ser usada para testes com várias gerações de dados estáticos. (Id34d1, b/280655188).

Mudanças na API

  • Todas as APIs públicas em testes de paginação agora têm a anotação @VisibleForTesting para garantir que essas APIs sejam usadas apenas em testes (I7db6e).
  • A API asSnapshot não exige mais a transmissão de um CoroutineScope O padrão agora é usar o contexto herdado do escopo pai. (Id0a78, b/282240990).
  • Os parâmetros do construtor TestPager foram reordenados para corresponder intuitivamente à ordem dos parâmetros reais do construtor Pager (I6185a).
  • O uso do tipo lambda () -> PagingSource<Key, Value> no teste de paginação de paginação foi migrado para o PagingSourceFactory<Key, Value>. (I4a950, b/280655188).

Mudanças de comportamento

  • O agente principal não é mais necessário para executar testes da Paging asSnapshot. A definição dele não muda mais o comportamento do teste. (Ie56ea).

Versão 3.2.0-alpha05

3 de maio de 2023

Lançamento de androidx.paging:paging-*:3.2.0-alpha05. A versão 3.2.0-alpha05 contém estas confirmações.

Mudanças na API

  • A API Paging Testing de asSnapshot agora define o parâmetro loadOperations como uma lambda vazia por padrão Isso permite chamar asSnapshot sem transmitir operações de carregamento para recuperar os dados do carregamento de atualização inicial. (Ied354, b/277233770).

Melhorias na documentação

  • Atualizamos a documentação sobre asPagingSourceFactory() para esclarecer que ele é um método de extensão em um Flow que retorna uma fábrica reutilizável para gerar instâncias de PagingSource (I5ff4f, I705b5).
  • Atualizamos a documentação sobre o construtor LoadResult.Page para esclarecer a necessidade de substituir itemsBefore e itemsAfter para oferecer suporte a saltos (Ied354).

Contribuições externas

Versão 3.2.0-alpha04

8 de fevereiro de 2023

Lançamento de androidx.paging:paging-*:3.2.0-alpha04. A versão 3.2.0-alpha04 contém estas confirmações.

Teste de Paging

  • O artefato paging-testing agora contém um método asPagingSourceFactory para criar uma pagingSourceFactory usando um Flow<List<Value>> a ser fornecido para um Pager. Cada List<Value>> emitido do fluxo representa uma geração de dados paginados. Isso facilita os testes de paginação em, por exemplo, transformações PagingData ao simular uma origem de dados para que o Pager colete (I6f230, b/235528239).
  • O artefato paging-testing foi expandido com novas APIs adequadas para verificar se os dados contidos em um Flow<PagingData<T>> estão corretos. Isso pode ser usado, por exemplo, para declarar a saída de um Flow<PagingData<T>> da camada ViewModel.

    Isso é feito usando a extensão asSnapshot do Kotlin no Flow<PagingData<Value>>, que converte o Flow<PagingData<Value>> em um List<Value> direto. O lambda asSnapshot permite imitar a interface do app usando APIs como scrollTo ou appendScrollWhile de uma maneira que possa ser repetida e consistente. Assim, você pode verificar se o snapshot dos dados está correto a qualquer momento no conjunto de dados paginados.

    // Create your ViewModel instance
    val viewModel = …
    // Get the Flow of PagingData from the ViewModel
    val data< Flow<PagingData<String>> = viewModel.data
    val snapshot: List<String> = data.asSnapshot {
      // Each operation inside the lambda waits for the data to settle before continuing
      scrollTo(index = 50)
    
      // While you can’t view the items within the asSnapshot call,
      // you can continuously scroll in a direction while some condition is true
      // i.e., in this case until you hit a placeholder item
      appendScrollWhile {  item: String -> item != “Header 1” }
    }
    // With the asSnapshot complete, you can now verify that the snapshot
    // has the expected values
    

    asSnapshot é um método suspend que precisa ser executado no runTest. Consulte Como testar corrotinas do Kotlin no Android para ter mais informações. (I55fd2, I5bd26, I7ce34, I51f4d, I2249f, Id6223, Ic4bab, Ib29b9, Ic1238, I96def, b/235528239).

Mudanças na API

  • As chamadas de interface para getItem e peek em AsyncPagingDataDiffer e PagingDataAdapter agora estão corretamente marcadas como apenas chamáveis na linha de execução principal (I699b6).
  • Remoção de caracteres curinga de tipos genéricos usados pelo TestPager, o que facilita o consumo dos resultados desses métodos no código escrito usando a linguagem de programação Java (I56c42).

Versão 3.2.0-alpha03

24 de outubro de 2022

Lançamento de androidx.paging:paging-*:3.2.0-alpha03. A versão 3.2.0-alpha03 contém estas confirmações.

Teste de Paging

Esta versão contém um novo artefato: paging-testing. Esse artefato fornece APIs projetadas para testar unidades em cada camada do app e a integração dele à Paging de forma isolada.

Por exemplo, esta primeira versão inclui uma classe TestPager que permite validar o comportamento da sua própria implementação de PagingSource personalizada independente de Pager e da IU real, de que você normalmente precisaria para simular a integração completa de Paging.

TestPager deve ser considerado falso - um teste duplo que reflita a implementação real de Pager fornecendo uma superfície de API simplificada para testar uma PagingSource. São APIs suspend e precisam ser executadas em runTest, conforme descrito no guia Como testar corrotinas do Kotlin no Android.

Um exemplo dessas APIs em uso pode ser encontrado nos testes de room-paging, que foram refatorados para usar TestPager.

Mudanças na API

  • Oferece iteração conveniente em LoadResult.Page.data por LoadResult.Page.iterator(). Isso permite indiretamente o uso do método flatten da biblioteca padrão de Kotlin (link em inglês) quando recebe uma List<LoadResult.Page>, como a propriedade pages do PagingState que é transmitida para o método PagingSource.getRefreshKey. (Ie0718).

Versão 3.2.0-alpha02

10 de agosto de 2022

Lançamento de androidx.paging:paging-*:3.2.0-alpha02. A versão 3.2.0-alpha02 contém estas confirmações.

Novos recursos

  • A Paging agora apresenta logs usando as classes AsyncPagingDataDiffer ou PagingDataAdapter para expor informações de depuração coletadas de PagingData.
  • Os logs podem ser ativados com o comando adb shell adb shell setprop log.tag.Paging [DEBUG|VERBOSE].(b/235527159).

Correções de bugs

  • Correção da falta do construtor PagingDataDiffer ao usar paging-common:3.2.0-alpha01 no ambiente de execução paging-runtime:3.1.1 ou em versões mais antigas (b/235256201).

Versão 3.2.0-alpha01

1º de junho de 2022

Lançamento de androidx.paging:paging-*:3.2.0-alpha01. A versão 3.2.0-alpha01 contém estas confirmações.

Mudanças na API

  • Adição de construtores para PagingDataAdapter e AsyncPagingDataDiffer, que aceitam CoroutineContext em vez de CoroutineDispatcher (Idc878).
  • Por padrão, PagingData.from() e PagingData.empty() não vão mais afetar o construtor CombinedLoadStates no apresentador. Uma nova sobrecarga que permite transmitir sourceLoadStates e remoteLoadStates a esses construtores foi adicionada para manter o comportamento da configuração de LoadStates e ser totalmente terminal (ou seja, NotLoading(endOfPaginationReached = false)), com a opção de também incluir estados remotos, se necessário. Caso a classe LoadStates não seja transmitida, o CombinedLoadStates anterior será mantido no lado do apresentador quando receber a PagingData estática (Ic3ce5, b/205344028).

Correções de bugs

  • Agora, temos a priorização do resultado de PagingSource.getRefreshKey() em vez de um elemento initialKey nos casos em que ele retornaria nulo, mas um initialKey não nulo foi definido (Ic9542, b/230391606).

Contribuição externa

  • Atualização da API :compose:ui-ui-test (updateApi) devido à migração de test-coroutines-lib (I3366d).

Versão 3.1

Versão 3.1.1

9 de março de 2022

Lançamento de androidx.paging:paging-*:3.1.1. A versão 3.1.1 contém estas confirmações.

Correções de bugs

  • Eventos LoadState.NotLoading intermediários entre gerações inseridos incorretamente por .cachedIn() foram removidos. Essa mudança facilita muito a reação a mudanças no LoadState, removendo eventos LoadState.NotLoading redundantes que foram produzidos entre novas tentativas de carregamentos com falha, durante a atualização ou durante a invalidação.

Versão 3.1.0

17 de novembro de 2021

Lançamento de androidx.paging:paging-*:3.1.0. A versão 3.1.0 contém estas confirmações.

Mudanças importantes desde a versão 3.0.0

  • As APIs Flow<PagingData>.observable e Flow<PagingData>.flowable não são mais experimentais.
  • Mudanças de comportamento para LoadState:
    • endOfPaginationReached agora é sempre false para LoadType.REFRESH em PagingSource e RemoteMediator.
    • Os LoadStates da Paging agora aguardam valores válidos de PagingSource e RemoteMediator antes de emitir downstream. Agora, novas gerações de PagingData sempre começarão corretamente com Loading (carregando) para o estado de atualização, em vez de redefinir para NotLoading (não carregando) incorretamente em alguns casos.
    • Os .loadStateFlow e .addLoadStateListener nas APIs de apresentador não enviam mais um CombinedLoadStates redundante inicial que sempre tenha estados de mediador definidos como null.
  • O cancelamento em gerações anteriores agora acontece normalmente em caso de invalidação / novas gerações. Não é mais necessário usar .collectLatest em Flow<PagingData>, embora ainda seja recomendado fazer isso.
  • O PagingSource.LoadResult.Invalid foi adicionado como um novo tipo de retorno de PagingSource.load, o que faz com que a Paging descarte qualquer solicitação de carregamento pendente ou futura para esse PagingSource e a invalide. Esse tipo de retorno foi projetado para processar dados potencialmente inválidos ou desatualizados que podem ser retornados do banco de dados ou da rede.
  • As APIs de apresentadores .onPagesPresented e .addOnPagesUpdatedListener, acionadas de forma síncrona conforme as páginas são apresentadas na IU, foram adicionadas. As atualizações de página podem acontecer nestes cenários:
    • O carregamento inicial de uma nova geração de PagingData será concluído, independente da nova geração incluir ou não mudanças nos itens apresentados, como: uma nova geração que conclui o carregamento inicial sem atualizações porque a lista é exatamente a mesma e ainda acionará esse callback.
    • Uma página é inserida, mesmo que ela não contenha novos itens.
    • Uma página é descartada, mesmo que esteja vazia.

Versão 3.1.0-rc01

3 novembro de 2021

Lançamento de androidx.paging:paging-*:3.1.0-rc01. A versão 3.1.0-rc01 contém estas confirmações.

Correções de bugs

  • Foram corrigidos um vazamento de memória e uma disputa em .cachedIn() nos casos em que vários eventos de carregamento eram enviados downstream pela Paging sem observadores ou entre a mudança de um observador para um novo PagingData (Ib682e).

Versão 3.1.0-beta01

13 de outubro de 2021

Lançamento de androidx.paging:paging-*:3.1.0-beta01. A versão 3.1.0-beta01 contém estas confirmações.

Correções de bugs

  • Foi corrigido um problema em que muitos acessos rápidos a itens podiam descartá-los para consideração na prefetchDistance, fazendo com que os carregamentos de página parassem. Isso é um problema principalmente quando muitos itens são dispostos de uma só vez em uma ordem que prioriza o carregamento em relação à direção de rolagem do usuário. Agora, esses acessos a itens são armazenados em buffer e priorizados de maneira síncrona para evitar que sejam descartados (aosp/1833273).

Versão 3.1.0-alpha04

29 de setembro de 2021

Lançamento de androidx.paging:paging-*:3.1.0-alpha04. A versão 3.1.0-alpha04 contém estas confirmações.

Mudanças na API

  • As APIs Flow<PagingData>.observable e Flow<PagingData>.flowable não são mais experimentais (Ie0bdd).

Correções de bugs

  • Para LoadStates, o endOfPaginationReached agora é sempre false para LoadType.REFRESH. Antes, era possível que o elemento endOfPaginationReached fosse true para o RemoteMediator REFRESH, mas não para a PagingSource. Esse comportamento agora foi consolidado para sempre retornar false, porque nunca faz sentido que REFRESH seja final, e está documentado como parte do contrato da API em LoadStates. Ao decidir se a paginação será encerrada, faça isso sempre com relação às direções APPEND ou PREPEND (I047b6).
  • Agora, os LoadStates da Paging aguardam valores válidos da PagingSource e do RemoteMediator antes de emitir um downstream entre gerações. Isso evita que novas gerações de PagingData enviem NotLoading (não carregando) em CombinedLoadStates.source.refresh, se ele já estiver no estado Loading (carregando). Agora, as novas gerações de PagingData sempre começam corretamente com o estado Loading para o estado da atualização, em vez de serem redefinidos como NotLoading incorretamente em alguns casos.

    O cancelamento em gerações anteriores agora acontece normalmente em caso de invalidação / novas gerações. Não é mais necessário usar o método .collectLatest em Flow<PagingData>, embora ainda seja altamente recomendável fazer isso. (I0b2b5, b/177351336, b/195028524).

  • Os métodos .loadStateFlow e .addLoadStateListener nas APIs do apresentador não enviam mais um CombinedLoadStates redundante inicial que sempre tenha estados de mediador definidos como null e os estados de origem definidos como NotLoading(endOfPaginationReached = false). O que isso significa:

    1. Os estados do mediador serão sempre preenchidos se você usar o RemoteMediator.
    2. Registrar um novo listener loadState ou um novo coletor em .loadStateFlow não emitirá mais o valor atual imediatamente se ele não tiver recebido CombinedLoadStates reais de PagingData. Isso pode acontecer se um coletor ou listener for iniciado antes do envio de PagingData (I1a748).

Versão 3.1.0-alpha03

21 de julho de 2021

Lançamento de androidx.paging:paging-*:3.1.0-alpha03. A versão 3.1.0-alpha03 contém estas confirmações.

Mudanças na API

  • Um terceiro tipo de retorno LoadResult, LoadResult.Invalid, foi adicionado à PagingSource. Quando PagingSource.load retorna LoadResult.Invalid, a Paging descartará os dados carregados e invalidará a PagingSource. Esse tipo de retorno foi projetado para processar dados potencialmente inválidos ou desatualizados que podem ser retornados do banco de dados ou da rede.

    Por exemplo, se uma entrada for gravada no banco de dados subjacente, mas a PagingSource não invalidá-la a tempo, é possível que os resultados retornados sejam inconsistentes caso a implementação dependa da imutabilidade do conjunto de dados de apoio responsáveis pelo carregamento (por exemplo, implementações dB do estilo LIMIT OFFSET). Nesse caso, é recomendável conferir se há alguma invalidação após o carregamento e retornar LoadResult.Invalid, que faz com que a Paging descarte todas as solicitações de carregamento pendentes ou futuras para essa PagingSource e as invalide.

    Esse tipo de retorno também tem suporte da API Paging2 que usa LivePagedList ou RxPagedList. Ao usar uma PagingSource com as APIs PagedList da Paging2, a PagedList é removida imediatamente, interrompendo outras tentativas de carregar dados nessa PagedList, e aciona a invalidação da PagingSource.

    LoadResult é uma classe selada, o que significa que essa é uma mudança incompatível com a origem, de modo que os casos de uso que usam diretamente resultados de PagingSource.load terão que processar LoadResult.Invalid durante a compilação. Por exemplo, os usuários do Kotlin que usam exhaustive-when para verificar o tipo de retorno terão que adicionar uma verificação de tipo inválido (Id6bd3, b/191806126, b/192013267).

Correções de bugs

  • Os callbacks de invalidação adicionados pelo PagingSource.registerInvalidatedCallback ou DataSource.addInvalidatedCallback agora são acionados automaticamente se estiverem registrados em uma PagingSource / DataSource já inválida. Isso resolve uma disputa que fazia com que a Paging descartasse sinais de invalidação e ficasse travada quando recebia uma origem que já era inválida no carregamento inicial. Além disso, agora os callbacks de invalidação são removidos corretamente após serem acionados, já que têm a garantia de serem chamados no máximo uma vez (I27e69).
  • Enviar o valor inicial do marcador de posição (InitialPagedList) de um fluxo PagedList recém-instanciado, por exemplo, LivePagedListBuilder ou RxPagedListBuilder não limpará mais os dados carregados anteriormente.

Versão 3.1.0-alpha02

1º de julho de 2021

Lançamento de androidx.paging:paging-*:3.1.0-alpha02. A versão 3.1.0-alpha02 contém estas confirmações.

Novos recursos

  • Adição das APIs onPagesPresented e do observador de fluxo, que são acionadas imediatamente após a atualização das páginas apresentadas na IU.

    Como essas atualizações são síncronas com a IU, você pode chamar métodos do adaptador, como .snapshot, .getItemCount, para inspecionar o estado após a atualização ser aplicada. Observe que .snapshot() foi chamado explicitamente porque pode ser dispendioso a cada atualização.

    As atualizações de página podem acontecer nos seguintes cenários:

    • O carregamento inicial de uma nova geração de PagingData será concluído, independente da nova geração incluir ou não mudanças nos itens apresentados, como: Uma nova geração que conclui o carregamento inicial sem atualizações porque a lista é exatamente a mesma e ainda acionará esse retorno de chamada.
    • Uma página é inserida, mesmo que ela não contenha novos itens.
    • Uma página é descartada, mesmo que ela esteja vazia (I272c9, b/189999634).

Correções de bugs

  • O acesso a PagedList.dataSource a partir do valor inicial produzido por LivePagedList ou RxPagedList não gerará mais uma IllegalStateException (I96707).

Versão 3.1.0-alpha01

2 de junho de 2021

Lançamento de androidx.paging:paging-*:3.1.0-alpha01. A versão 3.1.0-alpha01 contém estas confirmações.

Mudanças na API

  • As classes fornecidas por paging-rxjava3 agora estão no pacote androidx.paging.rxjava3 para que não entrem em conflito com paging-rxjava2 (Ifa7f6).

Correções de bugs

  • Foi corrigido um problema em que a Paging às vezes enviava eventos diferentes do ambiente autônomo para a RecyclerView, o que fazia com que determinados listeners fossem acionados antecipadamente (Ic507f, b/182510751).

Contribuição externa

  • Foram adicionadas APIs PagedList compat descontinuadas ao artefato rxjava3 (Id1ce2, b/182497591).

Paging Compose: versão 1.0.0

Versão 1.0.0-alpha20

24 de maio de 2023

Lançamento de androidx.paging:paging-compose:1.0.0-alpha20. A versão 1.0.0-alpha20 contém estas confirmações.

Novos recursos

  • A Paging Compose agora oferece suporte à visualização de uma lista de dados falsos criando um PagingData.from(fakeData) e unindo esse PagingData em um MutableStateFlow (por exemplo, MutableStateFlow(PagingData.from(listOf(1, 2, 3)))). Ao usar esses dados como a entrada no seu @Preview, as chamadas para collectAsLazyPagingItems() fornecerão LazyPagingItems visualizáveis. (I8a78d, b/194544557).

Correções de bugs

  • Os dados em cache de pager.flow.cachedIn que foram coletados no LazyPagingItems agora estarão disponíveis imediatamente após a restauração do estado sem exigir a coleta assíncrona. Isso significa que os dados em cache estarão prontos para apresentação imediatamente após a composição inicial, depois que o estado for restaurado. (I97a60, b/177245496).

Versão 1.0.0-alpha19

3 de maio de 2023

Lançamento de androidx.paging:paging-compose:1.0.0-alpha19. A versão 1.0.0-alpha19 contém estas confirmações.

Suporte a todos os layouts lentos

Anteriormente, a Paging Compose fornecia extensões items e itemsIndexed personalizadas em LazyListScope, o que significava que não era possível usar a Paging Compose com outros layouts lentos, como LazyVerticalGrid, HorizontalPager ou outros componentes lentos personalizados fornecidos pelas bibliotecas Wear e TV. A atualização principal desta versão é a resolução dessa inflexibilidade.

Para oferecer suporte a layouts mais lentos, precisávamos criar APIs em uma camada diferente. Em vez de fornecer uma API items personalizada para cada layout lento, a Paging Compose agora fornece métodos de extensão de nível um pouco mais baixo em LazyPagingItems em itemKey e itemContentType. Essas APIs se concentram em ajudar você a implementar os parâmetros key e contentType para as APIs items padrão que já existem para LazyColumn, LazyVerticalGrid e os equivalentes em APIs como HorizontalPager. (Ifa13b, Ib04f0, b/259385813).

Isso significa que o suporte a um LazyVerticalGrid seria assim:

// This part is unchanged
val lazyPagingItems = pager.collectAsLazyPagingItems()

LazyVerticalGrid(columns = GridCells.Fixed(2)) {
  // Here we use the standard items API
  items(
    count = lazyPagingItems.itemCount,
    // Here we use the new itemKey extension on LazyPagingItems to
    // handle placeholders automatically, ensuring you only need to provide
    // keys for real items
    key = lazyPagingItems.itemKey { it.uniqueId },
    // Similarly, itemContentType lets you set a custom content type for each item
    contentType = lazyPagingItems.itemContentType { "contentType" }
  ) { index ->
    // As the standard items call provides only the index, we get the item
    // directly from our lazyPagingItems
    val item = lazyPagingItems[index]
    PagingItem(item = item)
  }
}

Confira mais exemplos de uso dessas novas APIs neste link.

Embora essas mudanças tornem os exemplos LazyColumn e LazyRow algumas linhas mais longas, sentimos que a consistência em todos os layouts lentos era um fator importante para quem usa a Paging Compose daqui para frente. Por esse motivo, o uso das extensões existentes de LazyListScope foi suspenso. (I0c459, I92c8f, b/276989796).

Mudanças na API

  • Para facilitar a migração para as novas APIs, as funções de extensão items e itemsIndexed em LazyListScope agora oferecem suporte a um parâmetro contentType, espelhando a compatibilidade nas novas APIs. (Ib1918, b/255283378).

Atualizações de dependência

  • A Paging Compose atualizou a dependência do Compose 1.0.5 para o Compose 1.2.1. (Ib1918, b/255283378).

Versão 1.0.0-alpha18

8 de fevereiro de 2023

Lançamento de androidx.paging:paging-compose:1.0.0-alpha18 sem mudanças. A versão 1.0.0-alpha18 contém estas confirmações.

Versão 1.0.0-alpha17

24 de outubro de 2022

Lançamento de androidx.paging:paging-compose:1.0.0-alpha17. A versão 1.0.0-alpha17 contém estas confirmações.

Novos recursos

Versão 1.0.0-alpha16

10 de agosto de 2022

Lançamento de androidx.paging:paging-compose:1.0.0-alpha16. A versão 1.0.0-alpha16 contém estas confirmações.

Novos recursos

  • A Paging agora apresenta logs usando a classe LazyPagingItems para expor informações de depuração coletadas de PagingData.
  • Os logs podem ser ativados com o comando adb shell adb shell setprop log.tag.Paging [DEBUG|VERBOSE] ([b/235527159}(https://issuetracker.google.com/issues/235527159)).

Correções de bugs

  • Correção da falta do construtor PagingDataDiffer ao usar paging-compose:1.0.0-alpha15 no paging-common:3.1.1 ou em versões anteriores (b/235256201,b/239868768).

Versão 1.0.0-alpha15

1º de junho de 2022

Lançamento de androidx.paging:paging-compose:1.0.0-alpha15. A versão 1.0.0-alpha15 contém estas confirmações.

Mudanças na API

  • Adição de construtores para PagingDataAdapter e AsyncPagingDataDiffer, que aceitam CoroutineContext em vez de CoroutineDispatcher (Idc878).

Correções de bugs

  • A classe LazyPagingItems agora define o loadState inicial para ter uma atualização de LoadState.Loading (I55043, b/224855902).

Versão 1.0.0-alpha14

13 de outubro de 2021

Lançamento de androidx.paging:paging-compose:1.0.0-alpha14. A versão 1.0.0-alpha14 contém estas confirmações.

Versão 1.0.0-alpha13

29 de setembro de 2021

Lançamento de androidx.paging:paging-compose:1.0.0-alpha13. A versão 1.0.0-alpha13 contém estas confirmações.

Mudanças na API

  • A função LazyPagingItems.snapshot() foi substituída pela propriedade LazyPagingItems.itemSnapshotList (Ie2da8).
  • O LazyPagingItems.getAsState() descontinuado foi removido (Ie65e4).

Versão 1.0.0-alpha12

21 de julho de 2021

Lançamento de androidx.paging:paging-compose:1.0.0-alpha12. A versão 1.0.0-alpha12 contém estas confirmações.

Mudanças na API

  • Os métodos items(lazyPagingItems) e itemsIndexed(lazyPagingItems) usados para conectar a Paging à LazyColumn/Row agora aceitam o parâmetro de chave de opção que permite especificar uma chave estável que represente o item. Leia mais sobre chaves neste link (I7986d).
  • A função lazyPagingItems.getAsState(index) foi descontinuada. Use lazyPagingItems[index] (I086cb, b/187339372).

Versão 1.0.0-alpha11

30 de junho de 2021

Lançamento de androidx.paging:paging-compose:1.0.0-alpha11. A versão 1.0.0-alpha11 contém estas confirmações.

Versão 1.0.0-alpha10

2 de junho de 2021

Lançamento de androidx.paging:paging-compose:1.0.0-alpha10. A versão 1.0.0-alpha10 contém estas confirmações.

Versão 1.0.0-alpha09

18 de maio de 2021

Lançamento de androidx.paging:paging-compose:1.0.0-alpha09. A versão 1.0.0-alpha09 contém estas confirmações.

Correções de bugs

  • Agora, o itemCount e o getter de item de LazyPagingItems são observáveis, o que possibilita que ele também seja usado com LazyVerticalGrid. (Ie2446, b/171872064, b/168285687).

Compatibilidade do Compose

  • androidx.paging:paging-compose:1.0.0-alpha09 só é compatível com o Compose 1.0.0-beta07 e versões mais recentes.

Versão 1.0.0-alpha08

24 de fevereiro de 2021

Lançamento de androidx.paging:paging-compose:1.0.0-alpha08. A versão 1.0.0-alpha08 contém estas confirmações.

Atualizada para integração com o Compose 1.0.0-beta01.

Versão 1.0.0-alpha07

10 de fevereiro de 2021

Lançamento de androidx.paging:paging-compose:1.0.0-alpha07. A versão 1.0.0-alpha07 contém estas confirmações.

Atualizada para ser integrada ao Compose alpha12.

Versão 1.0.0-alpha06

28 de janeiro de 2021

Lançamento de androidx.paging:paging-compose:1.0.0-alpha06. A versão 1.0.0-alpha06 contém estas confirmações.

Correções de bugs

Atualizada para depender do Compose 1.0.0-alpha11.

Versão 1.0.0-alpha05

13 de janeiro de 2021

Lançamento de androidx.paging:paging-compose:1.0.0-alpha05. A versão 1.0.0-alpha05 contém estas confirmações.

Atualizada para depender do Compose 1.0.0-alpha10.

Versão 1.0.0-alpha04

16 de dezembro de 2020

Lançamento de androidx.paging:paging-compose:1.0.0-alpha04. A versão 1.0.0-alpha04 contém estas confirmações.

Correções de bugs

  • As propriedades de conveniência, CombinedLoadStates.refresh, CombinedLoadStates.prepend, CombinedLoadStates.append foram atualizadas para fazer a transição de Loading para NotLoading somente depois que os estados de carregamento do mediador e da origem forem NotLoading para garantir que a atualização remota tenha sido aplicada (I65619).

Versão 1.0.0-alpha03

2 de dezembro de 2020

Lançamento de androidx.paging:paging-compose:1.0.0-alpha03. A versão 1.0.0-alpha03 contém estas confirmações.

  • Atualização para corresponder ao Compose 1.0.0-alpha08.

Versão 1.0.0-alpha02

11 de novembro de 2020

Lançamento de androidx.paging:paging-compose:1.0.0-alpha02. A versão 1.0.0-alpha02 contém estas confirmações.

Mudanças na API

  • Adição dos métodos .peek(), .snapshot(), .retry() e .refresh() a LazyPagingItems que expõem a mesma funcionalidade disponível em AsyncPagingDataDiffer / PagingDataAdapter (Iddfe8, b/172041660)

Versão 1.0.0-alpha01

28 de outubro de 2020

Lançamento de androidx.paging:paging-compose:1.0.0-alpha01. A versão 1.0.0-alpha01 contém estas confirmações.

Novos recursos

O artefato paging-compose fornece integração entre a biblioteca Paging e o Jetpack Compose. Um exemplo de uso simples:

  @Composable
  @OptIn(ExperimentalLazyDsl::class)
  fun ItemsDemo(flow: Flow<PagingData<String>>) {
      val lazyPagingItems = flow.collectAsLazyPagingItems()
      LazyColumn {
          items(lazyPagingItems) {
              Text("Item is $it")
          }
      }
  }

Versão 3.0.1

Versão 3.0.1

21 de julho de 2021

Lançamento de androidx.paging:paging-*:3.0.1. A versão 3.0.1 contém estas confirmações.

Correções de bugs

  • Acessar a PagedList.dataSource do valor inicial produzido pela LivePagedList ou RxPagedList não gerará mais uma IllegalStateException (I96707).

Versão 3.0.0

Versão 3.0.0

5 de maio de 2021

Lançamento de androidx.paging:paging-*:3.0.0. A versão 3.0.0 contém estas confirmações.

Principais recursos da versão 3.0.0

A maioria das APIs da Paging 2.x.x foram descontinuadas e substituídas pelas novas APIs da Paging 3, proporcionando as seguintes melhorias:

  • Compatibilidade de primeira classe para corrotinas e fluxo do Kotlin
  • Suporte para cancelamento
  • Estado de carregamento e sinais de erro integrados
  • Funcionalidade de nova tentativa e atualização
  • As três subclasses do DataSource foram combinadas em uma classe PagingSource unificada
  • Transformações de páginas personalizadas, incluindo uma integrada para a adição de separadores
  • Carregamento de cabeçalhos e rodapés de estado

Versão 3.0.0-rc01

21 de abril de 2021

Lançamento de androidx.paging:paging-*:3.0.0-rc01. A versão 3.0.0-rc01 contém estas confirmações.

Correções de bugs

  • Foi corrigido um problema em que a Paging às vezes enviava eventos diferentes do ambiente autônomo para a RecyclerView, o que fazia com que determinados listeners fossem acionados antecipadamente (Ic507f, b/182510751).

Versão 3.0.0-beta03

24 de março de 2021

Lançamento de androidx.paging:paging-*:3.0.0-beta03. A versão 3.0.0-beta03 contém estas confirmações.

Correções de bugs

  • Reformulamos a forma como os marcadores são tratados quando a lista é recarregada para evitar saltos inesperados na RecyclerView. Consulte NullPaddedDiffing.md para ver mais detalhes (If1490, b/170027529, b/177338149).
  • Os vários builders PagedList (caminho de compatibilidade antigo) não chamam mais DataSource.Factory.create() de forma síncrona incorretamente na linha de execução principal quando .build() é chamado (b/182798948).

Versão 3.0.0-beta02

10 de Março de 2021

Lançamento de androidx.paging:paging-*:3.0.0-beta02. A versão 3.0.0-beta02 contém estas confirmações.

Mudanças na API

  • As extensões Rx3 agora propagam corretamente o requisito de ativação @ExperimentalCoroutinesApi. Anteriormente, elas eram marcadas no método @get, que é ignorado pelo Compilador de Kotlin devido a: https://youtrack.jetbrains.com/issue/KT-45227 (link em inglês) (I5733c).

Correções de bugs

  • Foram aplicadas restrições ao uso público de APIs experimentais (I6aa29, b/174531520).
  • Foi corrigido um bug que fazia com que PagingState fosse sempre null quando a atualização remota era chamada.
  • Correção de um bug em que páginas vazias retornadas pela PagingSource podiam impedir que a Paging buscasse novamente para completar prefetchDistance, fazendo com que a Paging ficasse "travada".

Versão 3.0.0-beta01

10 de fevereiro de 2021

Lançamento de androidx.paging:paging-*:3.0.0-beta01. A versão 3.0.0-beta01 contém estas confirmações.

Mudanças na API

  • Os wrappers Rx2 e Rx3 agora expõem a anotação experimental de que dependem. Se você estiver usando os wrappers de compatibilidade Rx no paging-rxjava2 ou paging-rxjava3, precisará anotar os usos com @OptIn(ExperimentalCoroutinesApi::class) (Ib1f9d).

Correções de bugs

  • Foi corrigida a IndexOutOfBoundsException: Inconsistency detected, que era gerada às vezes ao usar APIs DataSource v2 com caminhos de compatibilidade.
  • A chamada isInvalid durante a inicialização da DataSource, quando usada por caminhos de compatibilidade, agora é iniciada corretamente em fetchDispatcher, e não na linha de execução principal. Isso corrige uma IllegalStateException devido ao acesso do Db na linha de execução principal ao usar a implementação PagingSource do Room.

Versão 3.0.0-alpha13

27 de janeiro de 2021

Lançamento de androidx.paging:paging-*:3.0.0-alpha13. A versão 3.0.0-alpha13 contém estas confirmações.

Mudanças na API

  • A implementação de PagingSource.getRefreshKey não é mais opcional. Agora ele é uma função abstrata sem implementação padrão. A migração de usuários pode continuar retornando a implementação padrão, que simplesmente retorna null, mas getRefreshKey() precisa ter uma implementação real que retorne uma chave baseada na posição de rolagem atual do usuário. Isso permite que a Paging continue o carregamento no centro da janela de visualização via PagingState.anchorPosition, se possível (I4339a).
  • InvalidatingPagingSourceFactory agora é uma classe final (Ia3b0a).
  • Permite a configuração do comportamento de separador de terminal (cabeçalho / rodapé) com um parâmetro SeparadorType adicional opcional. As duas opções são estas:
    • FULLY_COMPLETE: comportamento existente. Espera as classes PagingSource e RemoteMediator marcarem endOfPaginationReached antes de adicionar separadores de terminal. Se RemoteMediator não for usado, o loadState remoto será ignorado. Isso é útil principalmente se você quiser mostrar separadores de seção somente quando a seção estiver totalmente carregada, incluindo a busca da origem remota, por exemplo, a rede.
    • SOURCE_COMPLETE: aguarda somente que a PagingSource marque endOfPaginationReached, mesmo que o RemoteMediator seja usado. Isso permite que cabeçalhos e rodapés sejam apresentados de forma síncrona com o carregamento inicial, evitando que os usuários precisem rolar para ver os separadores de terminal (Ibe993, b/174700218).

Correções de bugs

  • Foi corrigido um vazamento de memória raro que acontece quando uma PagingSource é invalidada antes que o PageFetcher possa iniciar o carregamento com ela (I9606b, b/174625633).

Versão 3.0.0-alpha12

13 de janeiro de 2021

Lançamento de androidx.paging:paging-*:3.0.0-alpha12. A versão 3.0.0-alpha12 contém estas confirmações.

Mudanças na API

  • InvalidatePagingSourceFactory não é mais uma classe abstrata, porque nunca teve um método abstrato (I4a8c4).
  • Adição de uma sobrecarga de .cachedIn() que aceita ViewModel em vez de Lifecycle ou CoroutineScope para usuários Java (I97d81, b/175332619).
  • Permite que autores de chamada do Java usem operações de transformação do PagingData de forma assíncrona, aceitando um Executor em argumentos do operador de transformação. Agora, todos os operadores de transformação -Sync têm o sufixo -Sync removido, e os usuários da corrotina do Kotlin precisarão desambiguar chamando a função da extensão que aceita um bloco de suspensão. Todos os operadores de transformação do PagingData foram movidos para as extensões na classe estática PagingDataTransforms. Os usuários de Java precisarão chamá-los usando auxiliares estáticos, por exemplo, PagingDataTransforms.map(pagingData, transform). Para usuários do Kotlin, a sintaxe é a mesma, mas será necessário importar a função (If6885, b/172895919).

Correções de bugs

  • Foi corrigido um bug em que o RemoteMediator.load() não era chamado durante adapter.refresh() se o final da paginação já tivesse sido alcançado.

Versão 3.0.0-alpha11

16 de dezembro de 2020

Lançamento de androidx.paging:paging-*:3.0.0-alpha11. A versão 3.0.0-alpha11 contém estas confirmações.

Novos recursos

  • Adição de compatibilidade com o estado salvo para os seguintes casos de uso básicos (a compatibilidade completa, especialmente no caso de fonte em camadas, ainda está em desenvolvimento):
    • O fluxo é armazenado em cache e o aplicativo não é eliminado. Por exemplo, o fluxo é armazenado em um modelo de visualização e a atividade é recriada no processo.
    • A origem da paginação é contada, os marcadores são ativados e o layout não é escalonado.

Mudanças na API

  • PagingSource.getRefreshKey() agora é uma API estável (I22f6f, b/173530980).
  • PagingSource.invalidate não é mais uma função aberta. Se você precisar receber uma notificação quando ocorrer a invalidação, chame o método registerInvalidatedCallback em vez de modificar a invalidação (I628d9, b/173029013, b/137971356).
  • Pager agora tem um único construtor experimental junto aos construtores normais, em vez de transformar APIs experimentais em uma API pública não experimental usando a anotação de permissão (I9dc61, b/174531520).
  • As propriedades de conveniência, CombinedLoadStates.refresh, CombinedLoadStates.prepend, CombinedLoadStates.append foram atualizadas para fazer a transição de Loading para NotLoading somente depois que os estados de carregamento do mediador e da origem forem NotLoading para garantir que a atualização remota tenha sido aplicada (I65619).
  • LoadParams.pageSize foi removido (já estava suspenso). A recomendação é usar LoadParams.loadSize na PagingSource.

    O LoadParams.loadSize é sempre igual ao PagingConfig.pageSize, exceto para a chamada de carregamento inicial em que ele é igual ao PagingConfig.initialLoadSize.

    Se você estiver testando a DataSource da Pagin2 sem usar um Pager ou uma PagedList, o pageSize pode não corresponder ao PagingConfig.pageSize se você também estiver definindo initialLoadSize. Se isso for importante para seus testes, use um Pager/PagedList, que definirá internamente o PageSize correto para os métodos de carregamento da DataSource (I98ac7, b/149157296).

Correções de bugs

  • Correção de uma falha causada por IllegalStateException ao usar separadores com o PagingConfig.maxSize (I0ed33, b/174787528).
  • Foi corrigido um bug em que o estado de carregamento de PREPEND / APPEND não atualizava para NotLoading(endOfPaginationReached = true) imediatamente após o carregamento inicial se o RemoteMediator estivesse definido (I8cf5a).
  • Foi corrigido um bug em que APIs do apresentador, como .snapshot(), .peek() etc., retornavam a lista anterior (desatualizada) nas atualizações de ListUpdateCallback.
  • Foi corrigido um bug em que os operadores de separadores não adicionavam cabeçalhos ou rodapés quando usados com o RemoteMediator.
  • Foi corrigido um bug em que o LoadState atualizava para NotLoading no RemoteMediator e travava no estado Loading
  • Foi corrigido um bug em que a API de compatibilidade Paging2.0, .asPagingSourceFactory(), podia fazer com que o DataSource de apoio fosse inicializado no CoroutineDispatcher incorreto. Isso resolve uma falha e possíveis casos de ANR, especialmente quando se usa a implementação atual da PagingSource do Room, que usa esse caminho de compatibilidade.

Versão 3.0.0-alpha10

2 de dezembro de 2020

Lançamento de androidx.paging:paging-*:3.0.0-alpha10. A versão 3.0.0-alpha10 contém estas confirmações.

Mudanças na API

  • As APIs dataRefreshFlow e dataRefreshListener descontinuadas foram removidas, porque são redundantes com as atualizações do loadStateFlow / Listener. Para aqueles que estão migrando, o equivalente de loadStateFlow é:

    loadStateFlow.distinctUntilChangedBy { it.refresh }
        .filter { it.refresh is NotLoading }
    

    (Ib5570, b/173530908).

Correções de bugs

  • endOfPaginationReached de REFRESH do RemoteMediator agora se propaga corretamente para as atualizações LoadState e impede o acionamento remoto de APPEND e PREPEND (I94a3f, b/155290248).
  • A apresentação de uma lista vazia devido a uma página inicial vazia ou à filtragem pesada não impedirá mais que Paging inicie carregamentos de PREPEND ou APPEND (I3e702, b/168169730).
  • Foi corrigido um problema em que a função getRefreshKey não era chamada nas gerações subsequentes da PagingSource quando as invalidações ocorriam rapidamente (I45460, b/170027530).

Contribuição externa

  • Uma nova classe abstrata InvalidatingPagingSourceFactory foi adicionada com uma API .invalidate() que encaminha a invalidação para todas as PagingSources que emite. Agradecemos a @claraf3 (Ie71fc, b/160716447).

Problemas conhecidos

  • Cabeçalhos e rodapés da transformação .insertSeparators() podem não aparecer imediatamente ao usar o RemoteMediator (b/172254056).
  • O uso de RemoteMediator pode fazer com que o LoadState remoto fique travado se a invalidação e PagingSource.load(LoadParams.Refresh(...)) forem concluídos antes de RemoteMediator.load() retornar (b/173717820).

Versão 3.0.0-alpha09

11 de novembro de 2020

Lançamento de androidx.paging:paging-*:3.0.0-alpha09. A versão 3.0.0-alpha09 contém estas confirmações.

Mudanças na API

  • Suspensão total dos métodos dataRefreshFlow / Listener com uma cláusula replaceWith (I6e2dd).

Correções de bugs

  • Foi corrigida a IllegalArgumentException que era gerada ao usar separadores com RemoteMediator e uma invalidação que era acionada enquanto um carregamento remoto que retorna endOfPagination ainda está em execução (I3a260).

Versão 3.0.0-alpha08

28 de outubro de 2020

Lançamento de androidx.paging:paging-*:3.0.0-alpha08. A versão 3.0.0-alpha08 contém estas confirmações.

Mudanças na API

  • As variantes Kotlin / Java do DataSource.InvalidatedCallback foram combinadas pela ativação de conversões SAM no Kotlin pela interface funcional (disponível no Kotlin 1.4). Isso também corrige um bug em que a variante Kotlin dos callbacks de invalidação não era chamada depois de ser transformada por .map ou .mapByPage (I1f244, b/165313046).

Correções de bugs

  • A interação da Paging com ViewPager foi melhorada consideravelmente. Mais especificamente, a Paging não cancelará mais uma chamada RemoteMediator#load devido a uma invalidação de página. Ela também não fará mais uma solicitação anexa/precedente de carregamento, se REFRESH for necessário, até a solicitação REFRESH ser concluída (I6390b, b/162252536).
  • A verificação de lint da API para MissingGetterMatchingBuilder está ativada para androidx (I4bbea, b/138602561).
  • Foi corrigido um bug em que os auxiliares .withLoadState* ConcatAdapter falhavam ao notificar a RecyclerView da linha de execução em segundo plano (I18bb5, b/170988309).
  • Foi corrigido um bug em que o carregamento de uma página não vazia muito pequena às vezes impedia a pré-busca de acionar os carregamentos corretamente (Iffda3, b/169259468).

Versão 3.0.0-alpha07

1º de outubro de 2020

Lançamento de androidx.paging:paging-*:3.0.0-alpha07. A versão 3.0.0-alpha07 contém estas confirmações.

Mudanças na API

  • Os operadores assíncronos PagingData baseados em Guava agora aceitam um Executor como parâmetro para controlar o contexto de execução (Id4372).

Correções de bugs

  • Correção da exceção IndexOutOfBounds gerada no RemoteMediator devido a uma disputa (I00b7f, b/165821814).
  • Foi corrigida uma disputa na conversão da DataSource para PagingSource, que fazia com que a PagingSource resultante ignorasse sinais de invalidação de DataSource.
  • Foi corrigido um problema na lógica de busca de página, que às vezes não conseguia coletar novas gerações da PagingSource até que o PagingDataAdapter.refresh() fosse invocado.
  • Foi corrigido um problema que fazia com que a posição de rolagem algumas vezes fosse perdida ao usar um DataSource convertido em PagingSource, como o produzido pelo Room, em conjunto com o RemoteMediator.

Contribuição externa

  • Agradecemos a @simonschiller por adicionar operadores de transformação assíncrona braseados em Guava, RxJava2 e RxJava3 para o PagingData.

Versão 3.0.0-alpha06

2 de setembro de 2020

Lançamento de androidx.paging:paging-*:3.0.0-alpha06. A versão 3.0.0-alpha06 contém essas confirmações.

Mudanças na API

  • UnsupportedOperationException com mensagens mais claras sobre a falta de suporte para IDs estáveis é gerada sempre que PagingDataAdapter.setHasStableIds é chamado. Ib3890, b/158801427

Correções de bugs

  • O insertSeparators não filtra mais páginas vazias, permitindo que a distância de pré-busca seja respeitada pelo apresentador, mesmo nos casos em que muitas páginas vazias são inseridas I9cff6, b/162538908

Versão 3.0.0-alpha05

19 de agosto de 2020

androidx.paging:paging-*:3.0.0-alpha05 é lançado. A versão 3.0.0-alpha05 contém essas confirmações.

Correções de bugs

  • Paging agora faz a pré-busca correta das páginas, mesmo quando os dados apresentados são muito filtrados.
  • Retornar LoadResult.Error para um carregamento repetido não faz mais com que os acessos ao item acionem incorretamente uma nova tentativa.

Contribuição externa

  • Agradecemos a Clara F por ajudar a limpar alguns testes. (549612).

Versão 3.0.0-alpha04

5 de agosto de 2020

Lançamento de androidx.paging:paging-*:3.0.0-alpha04. A versão 3.0.0-alpha04 contém essas confirmações (link em inglês).

Mudanças na API

  • A API peek() foi adicionada a AsyncPagingDataDiffer e PagingDataAdapter para permitir o acesso a dados apresentados sem acionar carregamentos de página (I38898, b/159104197).
  • A API snapshot() foi adicionada a PagingDataAdapter e AsyncPagingDataDiffer para permitir a extração dos itens apresentados sem acionar a busca da página (I566b6, b/159104197).
  • Foi adicionado um construtor PagingData.from(List<T>) para permitir a apresentação de listas estáticas, que podem ser combinadas com o fluxo geral de PagingData para mostrar listas estáticas em determinados estados, por exemplo, antes da conclusão do REFRESH inicial ou simplesmente para testar transformações (Id134d).
  • Descontinuação do uso das APIs Flow / Listener de dataRefresh porque se destinavam a expor o estado de itens apresentados em REFRESH, mas com melhorias para o tempo de callback de Flow / Listener de loadState e, para a propriedade itemCount, se tornaram redundantes (Ia19f3).
  • Foram adicionados wrappers de compatibilidade RxJava3 para PagingSource e RemoteMediator (I49ef3, b/161480176).

Correções de bugs

  • A PositionalDataSource convertida em PagingSource pelo auxiliar toPagingSourceFactory, incluindo a PagingSource gerado pelo Room agora se marca corretamente para oferecer suporte a saltos (I3e84c, b/162161201).
  • Correção de um bug em que o uso da variante síncrona de submitData às vezes levava a uma disputa, causando um ClosedSendChannelException (I4d702, b/160192222).

Contribuição externa

  • Agradecemos a Zac Sweers por adicionar wrappers de compatibilidade RxJava3 em nome do Slack (I49ef3, b/161480176).

Versão 3.0.0-alpha03

22 de julho de 2020

Lançamento de androidx.paging:paging-*:3.0.0-alpha03. A versão 3.0.0-alpha03 contém essas confirmações (link em inglês).

Mudanças na API

  • O construtor do PagingState agora é público, o que facilitará as implementações de teste de getRefreshKey() (I8bf15).
  • No Java, variantes de função de mapa do Kotlin do DataSource são ocultas para resolver ambiguidades entre variantes originais e do Kotlin. (If7b23, b/161150011)
  • As APIs redundantes criadas como conveniências para usuários do Kotlin foram marcadas como @JvmSynthetic (I56ae5).
  • Foram adicionadas sobrecargas para o construtor LoadResult.Page, que tem o padrão de itemsBefore e itemsAfter definido como COUNT_UNDEFINED (I47849).
  • Operadores PagingData existentes agora aceitam métodos de suspensão e introduzem novos operadores mapSync, flatMapSync e filterSync sem suspensão para usuários do Java. Os métodos de transformação existentes foram movidos para as funções de extensão. Por isso, agora os usuários do Kotlin precisarão importá-los. (I34239, b/159983232, links em inglês)

Correções de bugs

  • Agora, PagingSources (e PositionalDataSource) do Room vão mostrar um separador inicial como parte da primeira página. Assim, o usuário não vai precisar rolar para que ele apareça (I6f747, b/160257628).
  • Os acessos a itens em marcadores de posição agora acionam corretamente carregamentos de PagingSource até que seja retornada uma página que atenda ao índice solicitado depois de ser transformada pelo PagingData.filter() (I95625, b/158763195).
  • Foi corrigido um bug em que, às vezes, rolar depois que a PagingSource retorna um erro podia impedir que o método PagingDataAdapter.retry() tentasse novamente (I1084f, b/160194384).
  • Foi corrigido um problema em que os acessos a um item depois que uma página é suspensa podem não carregar páginas, embora o acesso estivesse dentro da prefetchDistance (Ie95ae, b/160038730).
  • A configuração do PagingConfig.maxSize não permite mais marcadores após um evento de suspensão (I2be29, b/159667766).

Versão 3.0.0-alpha02

24 de junho de 2020

Lançamento de androidx.paging:paging-*:3.0.0-alpha02. A versão 3.0.0-alpha02 contém essas confirmações (link em inglês).

Mudanças na API

  • Foram adicionadas sobrecargas para o construtor de PagingConfig com valores padrão comuns (I39c50, b/158576040).
  • Foram adicionadas sobrecargas para construtores de PagingDataAdapter e AsyncPagingDataDiffer com valores padrão comuns (Ie91f5).
  • As APIs do adaptador, dataRefreshFlow e dataRefreshListener, agora transmitem um booleano para sinalizar se um PagingData está vazio (I6e37e, b/159054196).
  • Foram adicionadas APIs RxJava e Guava para o RemoteMediator: RxRemoteMediator e ListenableFutureRemoteMediator.
  • Foram adicionados auxiliares ao PagingState para acesso a itens comuns, como isEmpty() e firstItemOrNull() (I3b5b6, b/158892717).

Correções de bugs

  • Agora, o Pager verifica a reutilização da PagingSource na fábrica para evitar a reutilização acidental de PagingSources inválidas, o que gerava um erro pouco claro (I99809, b/158486430).
  • As falhas de RemoteMediator REFRESH não impedem mais o carregamento da PagingSource (I38b1b, b/158892717).
  • A versão sem suspensão de submitData não causa mais uma falha devido à coleta simultânea em vários PagingData quando chamada após a versão de suspensão de submitData (I26358, b/158048877).
  • Foi corrigida a exceção "Não é possível coletar duas vezes a partir do pager", que poderia ocorrer após a mudança da configuração (I58bcc, b/158784811).

Versão 3.0.0-alpha01

10 de junho de 2020

Lançamento de androidx.paging:paging-*:3.0.0-alpha01. A versão 3.0.0-alpha01 contém essas confirmações (link em inglês).

A biblioteca Paging foi atualizada para a versão 3.0 para ativar vários novos recursos importantes.

Novos recursos da versão 3.0

Problemas conhecidos

  • Os javadocs da Paging 3 ainda não estão disponíveis. Enquanto isso, use os guias vinculados acima ou os documentos do Kotlin. (b/158614050, link em inglês)

Versão 2.1.2

Versão 2.1.2

18 de março de 2020

Lançamento de androidx.paging:paging:2.1.2. A versão 2.1.2 contém essas confirmações contra a 2.1.0 (link em inglês).

Correções de bugs

  • Correção para IndexOutOfBoundsException em casos raros ao converter uma posição durante a invalidação.

Problema da versão

  • A versão 2.1.1 da Paging foi lançada incorretamente de uma ramificação configurada incorretamente, expondo APIs parcialmente implementadas e funcionalidades futuras de uma próxima versão.

  • A Paging 2.1.2 contém a correção de centralização de carga lançada originalmente na versão 2.1.1, mas desta vez escolhida corretamente na versão 2.1.0. É altamente recomendável fazer upgrade para essa versão, caso você esteja usando a versão 2.1.1 no momento.

Versão 2.1.1

Versão 2.1.1

18 de dezembro de 2019

Lançamento de androidx.paging:paging-*:2.1.1. A versão 2.1.1 contém estas confirmações.

Correções de bugs

  • Os carregamentos iniciais contíguos de PositionalDataSources agora estão centralizados no último acesso quando os marcadores estão desativados.

Versão 2.1.0

Versão 2.1.0

25 de janeiro de 2019

Lançamento da Paging 2.1.0 sem mudanças de 2.1.0-rc01.

Versão 2.1.0-rc01

6 de dezembro de 2018

Lançamento da Paging 2.1.0-rc01 sem mudanças de 2.1.0-beta01.

Versão 2.1.0-beta01

1º de novembro de 2018

Lançamento da Paging 2.1.0-beta01 sem mudanças de 2.1.0-alpha01.

Versão 2.1.0-alpha01

12 de outubro de 2018

A Paging 2.1.0-alpha01 tem duas adições importantes: descarte de página e bibliotecas de extensões KTX para cada artefato, além de várias outras alterações de API e correções bugs.

Mudanças na API

  • Adição de PagedList.Config.Builder.setMaxSize() para limitar o número de itens carregados na memória.
  • Adição de androidx.paging.Config() como alternativa Kotlin para PagedList.Config.Builder.
  • Adição de androidx.paging.PagedList() como alternativa Kotlin para PagedList.Builder.
  • Adição de DataSourceFactory.toLiveData() como alternativa Kotlin para LivePagedListBuilder.
  • Adição de DataSourceFactory.toObservable() e toFlowable() como alternativas Kotlin para RxPagedListBuilder.
  • Foi adicionado o AsyncPagedListDiffer.addPagedListListener() para detectar quando a PagedList foi trocada (b/111698609).
  • Foi adicionada a variante PagedListAdapter.onCurrentListChanged(), que transmite a lista antiga e a nova. A variante anterior foi descontinuada.
  • Foram adicionadas variantes PagedListAdapter/AsyncPagedListDiffer.submitList() que recebem um callback extra que é acionado se/quando a pagedlist é mostrada, depois da diferenciação. Isso permite que você sincronize uma troca de PagedList com outras atualizações da IU. b/73781068 (link em inglês)
  • Adição de PagedList.getLoadedCount() para informar quantos itens estão na memória. Observe que o valor de retorno será sempre igual a .size() se os marcadores estiverem desativados.

Correções de bugs

  • Foi corrigida uma disputa ao diferenciar se as listas são reutilizadas (b/111591017).
  • PagedList.loadAround() agora gera IndexOutOfBoundsException quando o índice é inválido. Anteriormente, ele poderia falhar com uma exceção diversa incerta.
  • Foi corrigido um caso em que um tamanho de carga inicial extremamente pequeno junto com dados inalterados resultava em nenhum outro carregamento (b/113122599).

Versão 2.0.0

Versão 2.0.0

1º de outubro de 2018

A Paging 2.0.0 foi lançada com uma única correção de bug.

Correções de bugs

  • Foi corrigida uma falha que poderia ocorrer com a rolagem muito rápida usando PositionalDataSource e marcadores b/114635383.

Versão 2.0.0-beta01

2 de julho de 2018

Correções de bugs

  • O conteúdo ausente em alguns casos de prefixo (marcadores de posição desativados, PositionalDataSource) foi corrigido (b/80149146).
  • Já lançado em 1.0.1. Falhas em que PagedListAdapter e AsyncPagedListDiffer não sinalizavam eventos de movimentação foram corrigidas b/110711937.

Dependências anteriores ao AndroidX

Para as seguintes versões da Paging anteriores ao AndroidX, inclua estas dependências:

dependencies {
    def paging_version = "1.0.0"

    implementation "android.arch.paging:runtime:$paging_version"

    // alternatively - without Android dependencies for testing
    testImplementation "android.arch.paging:common:$paging_version"

    // optional - RxJava support
    implementation "android.arch.paging:rxjava2:$paging_version"
}

Versão 1.0.1

Versão 1.0.1

26 de junho de 2018

A Paging 1.0.1 foi lançada com uma única correção de bug em runtime. É altamente recomendável usar a 1.0.1 por questão de estabilidade. A Paging RxJava2 1.0.1 também foi liberada e é idêntica à 1.0.0-rc1.

Correções de bugs

  • Correção de falhas em que PagedListAdapter e AsyncPagedListDiffer não sinalizavam eventos de movimentação (b/110711937).

RxJava2 versão 1.0.0

RxJava2 Versão 1.0.0-rc1

16 de maio de 2018

A Paging 1.0.0-rc1 RxJava2 está progredindo para se tornar candidata a lançamento sem mudanças desde a versão Alfa inicial.

Versão 1.0.0

Versão 1.0.0-rc1

19 de abril de 2018 Candidata a lançamento da Paging

Não temos outros problemas conhecidos ou novos recursos programados para a Paging versão 1.0.0. Faça upgrade dos seus projetos para usar 1.0.0-rc1 e ajude a testá-la para que possamos lançar uma versão 1.0.0 sólida.

Não há mudanças nessa versão. Ela é a mesma que 1.0.0-beta1.

Versão 1.0.0-beta01

5 de abril de 2018

A Paging ficará na versão Beta por um breve período antes de progredir para candidata a lançamento. Não estamos planejando outras mudanças na API para a Paging 1.0, e a resistência a qualquer mudança na API é muito alta.

A compatibilidade do RxJava2 Alfa com a Paging foi lançada como um módulo opcional diferente (android.arch.paging:rxjava2:1.0.0-alpha1), e a versão dela será temporariamente controlada em separado até ela se estabilizar.

Essa nova biblioteca traz uma alternativa à RxJava2 para LivePagedListBuilder, capaz de construir Observables e Flowables, usando Schedulers em vez de Executors:

Kotlin

val pagedItems = RxPagedListBuilder(myDataSource, /* page size */ 50)
        .setFetchScheduler(myNetworkScheduler)
        .buildObservable()

Java

Observable<PagedList<Item>> pagedItems =
        RxPagedListBuilder(myDataSource, /* page size */ 50)
                .setFetchScheduler(myNetworkScheduler)
                .buildObservable();

Novos recursos

  • O RxPagedListBuilder foi adicionado com o novo artefato android.arch.paging:rxjava2.

Mudanças na API

  • Mudanças de API para esclarecer o papel dos executores em builders:

    • setBackgroundThreadExecutor() renomeado como setFetchExecutor() (em PagedList.Builder e LivePagedListBuilder)

    • setMainThreadExecutor() renomeado como setNotifyExecutor() (em PagedList.Builder).

  • O membro PagedList.mCallbacks foi corrigido para que seja privado.

Correções de bugs

  • LivePagedListBuilder aciona o carregamento inicial de PagedList no executor especificado, em vez do pool de linhas de execução de IO dos Componentes de arquitetura.

  • Foi corrigido o comportamento de invalidação em wrappers DataSource internos, usados para implementar o DataSource.map, bem como o carregamento de PositionalDataSource com marcadores desativados b/77237534.

Versão 1.0.0-alpha7

21 de março de 2018

Lançamento da Paging 1.0.0-alpha7 junto com Lifecycles 1.1.1. Como a Paging alpha7 depende do movimento da classe Function mencionada acima, você precisará atualizar sua dependência de lifecycle:runtime para android.arch.lifecycle:runtime:1.1.1.

A Paging alpha7 está sendo planejada para ser a versão final antes de chegar à versão beta.

Mudanças na API

  • Os objetos DataSource.LoadParams agora têm um construtor público e os objetos DataSource.LoadCallback agora são abstratos. Isso permite unir o DataSource ou testar diretamente um DataSource com um callback simulado b/72600421.
  • Mapeadores para DataSource e DataSource.Factory
    • map(Function<IN,OUT>) permite que você transforme, una ou decore resultados carregados por um DataSource.
    • mapByPage(<List<IN>,List<OUT>>) proporciona o mesmo para o processamento em lote. Por exemplo, se os itens carregados do SQL precisarem consultar também um banco de dados separado, isso poderá ser feito em lote.
  • PagedList#getDataSource() foi adicionado como um método de conveniência (b/72611341).
  • Todas as classes descontinuadas foram removidas da API, incluindo os elementos remanescentes do pacote recyclerview.extensions e o LivePagedListProvider.
  • DataSource.Factory foi modificada de uma interface para uma classe abstrata para ativar a funcionalidade do mapa.

Correções de bugs

  • Builders foram alterados para serem finais (b/70848565).
  • A implementação de DataSource do Room agora foi corrigida para processar consultas de várias tabelas. Essa correção está presente no Room 1.1.0-beta1, confira acima.
  • Foi corrigido um bug em que o BoundaryCallback.onItemAtEndLoaded não seria invocado para PositionalDataSource se os marcadores estivessem ativados e o tamanho total fosse um múltiplo exato do tamanho da página.

Versão 1.0.0-alpha5

22 de janeiro de 2018

Correções de bugs

  • Correção do carregamento de página quando os marcadores de posição estão desativados (b/70573345).
  • Foram criados mais registros para rastrear o bug IllegalArgumentException b/70360195 (e suposta correção do lado do Room).
  • Correções de código de amostra Javadoc b/70411933, b/71467637.