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
Singleo GuavaListenableFuture. - 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 PagedListPagedListAdapter
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
DataSourceaPagingSource, ma lasciare invariato il resto dell'implementazione di Paging. - Puoi eseguire la migrazione di
PagedListePagedListAdapter, ma continuare a utilizzare l' APIDataSourceprecedente. - 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 |
|
|
|
|
|
|
|
|
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.ConfigaPagingConfig. LivePagedListBuildereRxPagedListBuildersono stati combinati in un'unica classePager.Pagerespone un oggettoFlow<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 modulipaging-rxjava*epaging-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);