Esegui la migrazione a Paging 3 (visualizzazioni)

Concetti e implementazione di Jetpack Compose

Paging 3 è significativamente diverso dalle versioni precedenti della libreria Paging. Questa versione offre funzionalità avanzate e risolve le difficoltà comuni nell'utilizzo di Paging 2. Se la tua app utilizza già una versione precedente della libreria Paging, leggi questa pagina per scoprire di più sulla migrazione a Paging 3.

Se Paging 3 è la prima versione della libreria Paging che utilizzi in tuo app, consulta Caricare e visualizzare i dati paginati per informazioni sull'utilizzo di base.

Vantaggi della migrazione a Paging 3

Paging 3 include le seguenti funzionalità non presenti nelle versioni precedenti della libreria:

  • Supporto di prima classe per le coroutine Kotlin e Flow.
  • Supporto per il caricamento asincrono utilizzando le primitive RxJava Single o Guava ListenableFuture.
  • Stati di caricamento e segnali di errore integrati per la progettazione di UI reattive, inclusa la funzionalità di ripetizione e aggiornamento.
  • Miglioramenti al livello del repository, incluso il supporto per l'annullamento e un'interfaccia di origine dati semplificata.
  • Miglioramenti al livello di presentazione, ai separatori di elenchi, alle trasformazioni di pagine personalizzate e alle intestazioni e ai piè di pagina dello stato di caricamento.

Eseguire la migrazione dell'app a Paging 3

Per eseguire la migrazione completa a Paging 3, devi eseguire la migrazione di tutti e tre i componenti principali di Paging 2:

  • Classi DataSource
  • PagedList
  • PagedListAdapter

Tuttavia, alcuni componenti di Paging 3 sono retrocompatibili con le versioni precedenti di Paging. In particolare, l'API PagingSource di Paging 3 può essere un'origine dati per LivePagedListBuilder e RxPagedListBuilder delle versioni precedenti. Allo stesso modo, l'API Pager può utilizzare oggetti DataSource precedenti con il metodo asPagingSourceFactory. Ciò significa che hai le seguenti opzioni di migrazione:

  • Puoi eseguire la migrazione di DataSource a PagingSource, ma lasciare invariato il resto dell'implementazione di Paging.
  • Puoi eseguire la migrazione di PagedList e PagedListAdapter, ma continuare a utilizzare l' API DataSource precedente.
  • Puoi eseguire la migrazione dell'intera implementazione di Paging per eseguire la migrazione completa dell'app a Paging 3.

Le sezioni di questa pagina spiegano come eseguire la migrazione dei componenti di Paging su ogni livello dell'app.

Panoramica della migrazione

Per eseguire la migrazione completa a Paging 3 mantenendo l'implementazione di RecyclerView, devi aggiornare i seguenti componenti:

Componente Paging 2

Sostituzione Paging 3

PageKeyedDataSource

PagingSource

PagedListAdapter

PagingDataAdapter

LivePagedListBuilder

Pager

BoundaryCallback

RemoteMediator

Classi DataSource

Questa sezione descrive le modifiche necessarie per eseguire la migrazione di un'implementazione di Paging precedente in modo da utilizzare PagingSource.

PageKeyedDataSource, PositionalDataSource e ItemKeyedDataSource di Paging 2 sono tutti combinati nell'API PagingSource in Paging 3. I metodi di caricamento di tutte le classi API precedenti sono combinati in un unico metodo load in PagingSource. Ciò riduce la duplicazione del codice perché gran parte della logica dei metodi di caricamento nelle implementazioni delle classi API precedenti è spesso identica.

Tutti i parametri del metodo di caricamento vengono sostituiti in Paging 3 con una classe sealed LoadParams, che include sottoclassi per ogni tipo di caricamento. Se devi distinguere tra i tipi di caricamento nel metodo load, controlla quale sottoclasse di LoadParams è stata passata: LoadParams.Refresh, LoadParams.Prepend o LoadParams.Append.

Per scoprire di più sull'implementazione di PagingSource, consulta Definire un'origine dati.

Chiavi di aggiornamento

Le implementazioni di PagingSource devono definire come riprendere gli aggiornamenti dal centro dei dati paginati caricati. Per farlo, implementa getRefreshKey per mappare la chiave iniziale corretta utilizzando state.anchorPosition come indice a cui è stato eseguito l'accesso più di recente.

Java (RxJava)

// Replaces ItemKeyedDataSource.
@Nullable
@Override
String getRefreshKey(state: PagingState<String, User>) {
  Integer anchorPosition = state.anchorPosition;
  if (anchorPosition == null) {
    return null;
  }

  return state.getClosestItemToPosition(anchorPosition);
}

// Replaces PositionalDataSource.
@Nullable
@Override
Integer getRefreshKey(state: PagingState<Integer, User>) {
  return state.anchorPosition;
}

Java (Guava/LiveData)

// Replaces ItemKeyedDataSource.
@Nullable
@Override
String getRefreshKey(state: PagingState<String, User>) {
  Integer anchorPosition = state.anchorPosition;
  if (anchorPosition == null) {
    return null;
  }

  return state.getClosestItemToPosition(anchorPosition);
}

// Replaces PositionalDataSource.
@Nullable
@Override
Integer getRefreshKey(state: PagingState<Integer, User>) {
  return state.anchorPosition;
}

PagedList

Questa sezione descrive tutte le modifiche necessarie per eseguire la migrazione di un'implementazione di Paging precedente in modo da utilizzare Pager e PagingData in Paging 3.

Classi PagedListBuilder

PagingData sostituisce l'oggetto PagedList esistente di Paging 2. Per eseguire la migrazione a PagingData, devi aggiornare quanto segue:

  • La configurazione della paginazione è stata spostata da PagedList.Config a PagingConfig.
  • LivePagedListBuilder e RxPagedListBuilder sono stati combinati in un'unica classe Pager.
  • Pager espone un oggetto Flow<PagingData> osservabile con la sua proprietàflow. Sono disponibili anche varianti RxJava e LiveData come proprietà di estensione, che possono essere chiamate da Java tramite metodi statici e sono fornite rispettivamente dai moduli paging-rxjava* e paging-runtime.

Java (RxJava)

// CoroutineScope helper provided by the lifecycle-viewmodel-ktx artifact.
CoroutineScope viewModelScope = ViewModelKt.getViewModelScope(viewModel);
Pager<Integer, User> pager = Pager<>(
  new PagingConfig(/* pageSize = */ 20),
  () -> ExamplePagingSource(backend, query));

Flowable<PagingData<User>> flowable = PagingRx.getFlowable(pager);
PagingRx.cachedIn(flowable, viewModelScope);

Java (Guava/LiveData)

// CoroutineScope helper provided by the lifecycle-viewmodel-ktx artifact.
CoroutineScope viewModelScope = ViewModelKt.getViewModelScope(viewModel);
Pager<Integer, User> pager = Pager<>(
  new PagingConfig(/* pageSize = */ 20),
  () -> ExamplePagingSource(backend, query));

PagingLiveData.cachedIn(PagingLiveData.getLiveData(pager), viewModelScope);

Per scoprire di più sulla configurazione di uno stream reattivo di PagingData oggetti utilizzando Paging 3, consulta Configurare uno stream di PagingData.

PagedListAdapter

Questa sezione descrive tutte le modifiche necessarie per eseguire la migrazione di un'implementazione di Paging precedente in modo da utilizzare le classi PagingDataAdapter o AsyncPagingDataDiffer di Paging 3.

Paging 2 utilizza PagedListAdapter per associare un oggetto PagedList a un oggetto RecyclerView. In Paging 3, PagingData sostituisce PagedList.

Paging 3 fornisce PagingDataAdapter per gestire i nuovi PagingData reattivi stream. In caso contrario, PagedListAdapter e PagingDataAdapter hanno la stessa interfaccia. Per eseguire la migrazione da PagedListAdapter a PagingDataAdapter, modifica l'implementazione di PagedListAdapter in modo che estenda PagingDataAdapter.

Per scoprire di più su PagingDataAdapter, consulta Definire un adattatore RecyclerView.

AsyncPagedListDiffer

Se al momento utilizzi un'implementazione personalizzata di RecyclerView.Adapter con AsyncPagedListDiffer, esegui la migrazione dell'implementazione in modo da utilizzare AsyncPagingDataDiffer fornito in Paging 3:

Kotlin

AsyncPagingDataDiffer(diffCallback, listUpdateCallback)

Java (RxJava)

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);

Java (Guava/LiveData)

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);