Paging 3 unterscheidet sich erheblich von früheren Versionen der Paging-Bibliothek. Diese Version bietet erweiterte Funktionen und Probleme bei der Nutzung von Paging 2. Wenn Ihre App bereits eine frühere der Paging-Bibliothek verwenden, finden Sie auf dieser Seite weitere Informationen über die Migration zu Seite 3.
Wenn Paging 3 die erste Version der Paging-Bibliothek ist, die Sie in finden Sie unter Seitenladevorgänge laden und anzeigen Daten für die grundlegende Nutzung Informationen.
Vorteile der Migration zu Paging 3
Seite 3 umfasst die folgenden Funktionen, die zuvor nicht vorhanden waren Versionen der Bibliothek:
- Erstklassige Unterstützung für Kotlin-Koroutinen und Flow.
- Unterstützung für asynchrones Laden mit RxJava
Single
oder GuavaListenableFuture
Primitiven. - Integrierter Ladestatus und Fehlersignale für responsives UI-Design, einschließlich Wiederholungs- und Aktualisierungsfunktion.
- Verbesserungen an der Repository-Ebene, einschließlich Stornierungsunterstützung und vereinfachte Schnittstelle für die Datenquelle.
- Verbesserungen der Präsentationsebene, der Listentrennzeichen und der benutzerdefinierten Seite Transformationen und Laden von Kopf- und Fußzeilen zu Statusangaben.
Anwendung zu Paging 3 migrieren
Für eine vollständige Migration zu Paging 3 müssen Sie alle drei Hauptkomponenten migrieren. aus Seite 2:
DataSource
KursPagedList
PagedListAdapter
Einige Komponenten von Paging 3 sind jedoch abwärtskompatibel mit den
von Paging an. Insbesondere
PagingSource
API von Paging
3 kann eine Datenquelle für
LivePagedListBuilder
und RxPagedListBuilder
aus älteren Versionen. Ebenso kann die Pager
API ältere
DataSource
-Objekte mit dem Parameter
asPagingSourceFactory()
-Methode. Das bedeutet, dass Sie
Migrationsoptionen:
- Sie können Ihre
DataSource
zuPagingSource
migrieren, den Rest Ihrer Paging-Implementierung unverändert. - Sie können Ihre
PagedList
undPagedListAdapter
migrieren, aber weiterhin die ältereDataSource
API. - Sie können die gesamte Paging-Implementierung migrieren, um Ihre Anwendung vollständig zu migrieren. Seite 3.
In den Abschnitten auf dieser Seite wird erläutert, wie Sie Paging-Komponenten auf jeder Ebene migrieren. Ihrer App.
DataSource-Klassen
In diesem Abschnitt werden alle Änderungen beschrieben, die zum Migrieren einer älteren Paging-Datei erforderlich sind.
Implementierung zur Verwendung von PagingSource
.
PageKeyedDataSource
, PositionalDataSource
und ItemKeyedDataSource
aus Seite 2 in der PagingSource
API auf Seite 3 zusammengefasst. Die
Lademethoden aus allen alten API-Klassen in einer einzigen
Methode load()
in PagingSource
. Dies reduziert Codeduplizierung, da ein Großteil der
die Logik der Lademethoden in Implementierungen der alten API-Klassen
oft identisch sind.
Alle Parameter für die Lademethoden werden in Seite 3 durch LoadParams
ersetzt
Sealed-Klasse, die Unterklassen für jeden Ladetyp enthält. Bei Bedarf
in der load()
-Methode unterscheiden und prüfen,
Die abgeleitete Klasse von LoadParams
wurde übergeben in: LoadParams.Refresh
,
LoadParams.Prepend
oder LoadParams.Append
.
Weitere Informationen zum Implementieren von PagingSource
finden Sie unter Daten definieren
Quelle.
Schlüssel aktualisieren
In Implementierungen von PagingSource
muss definiert werden, wie Aktualisierungen vom
in der Mitte der geladenen Seitendaten. Hierzu implementieren Sie
getRefreshKey()
, um den richtigen Anfangsschlüssel mit state.anchorPosition
als neuestem Schlüssel zuzuordnen
Index, auf den zugegriffen wurde.
Kotlin
// Replaces ItemKeyedDataSource. override fun getRefreshKey(state: PagingState): String? { return state.anchorPosition?.let { anchorPosition -> state.getClosestItemToPosition(anchorPosition)?.id } } // Replacing PositionalDataSource. override fun getRefreshKey(state: PagingState ): Int? { return state.anchorPosition }
Java
// Replaces ItemKeyedDataSource. @Nullable @Override String getRefreshKey(state: PagingState) { Integer anchorPosition = state.anchorPosition; if (anchorPosition == null) { return null; } return state.getClosestItemToPosition(anchorPosition); } // Replaces PositionalDataSource. @Nullable @Override Integer getRefreshKey(state: PagingState ) { return state.anchorPosition; }
Java
// Replacing ItemKeyedDataSource. @Nullable @Override String getRefreshKey(state: PagingState) { Integer anchorPosition = state.anchorPosition; if (anchorPosition == null) { return null; } return state.getClosestItemToPosition(anchorPosition); } // Replacing PositionalDataSource. @Nullable @Override Integer getRefreshKey(state: PagingState ) { return state.anchorPosition; }
Transformationen auflisten
In älteren Versionen der Paging-Bibliothek stützt sich die Transformation der Seitendaten auf zu den folgenden Methoden:
DataSource.map()
DataSource.mapByPage()
DataSource.Factory.map()
DataSource.Factory.mapByPage()
Auf Seite 3 werden alle Transformationen als Operatoren auf PagingData
angewendet. Wenn
Verwenden Sie eine der Methoden in der
vorherigen Liste, um Ihre Seitenliste umzuwandeln,
müssen Sie die Transformationslogik vom DataSource
in den
PagingData
beim Erstellen der Pager
mit dem neuen PagingSource
.
Weitere Informationen zum Anwenden von Transformationen auf Seitendaten mit Paging 3 finden Sie unter Datenstreams transformieren
Seitenliste
In diesem Abschnitt werden alle Änderungen beschrieben, die zum Migrieren einer älteren Paging-Datei erforderlich sind.
-Implementierung zur Verwendung von Pager
und PagingData
in Seite 3.
PagedListBuilder-Klassen
PagingData
ersetzt die vorhandene PagedList
aus Seite 2. So migrieren Sie zu
PagingData
müssen Sie Folgendes aktualisieren:
- Seitenkonfiguration wurde von
PagedList.Config
nachPagingConfig
verschoben. LivePagedListBuilder
undRxPagedListBuilder
wurden zu einem einzelnePager
-Klasse.Pager
stellt eine beobachtbareFlow<PagingData>
mit ihrer.flow
-Eigenschaft bereit. RxJava- und LiveData-Varianten sind auch als Erweiterungs-Properties verfügbar. sind aus Java über statische Methoden aufrufbar und werden vom Das Modulpaging-rxjava*
bzw.paging-runtime
.
Kotlin
val flow = Pager( // Configure how data is loaded by passing additional properties to // PagingConfig, such as prefetchDistance. PagingConfig(pageSize = 20) ) { ExamplePagingSource(backend, query) }.flow .cachedIn(viewModelScope)
Java
// 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
// 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);
Weitere Informationen zum Einrichten eines reaktiven Streams von PagingData
-Objekten mithilfe von
Seite 3, siehe Stream von
PagingData
BoundaryCallback für mehrschichtige Quellen
Auf Seite 3
RemoteMediator
ersetzt
PagedList.BoundaryCallback
als Handler für das Paging aus dem Netzwerk und der Datenbank.
Weitere Informationen zur Verwendung von RemoteMediator
für die Auslagerung aus dem Netzwerk und der Datenbank in
Seite 3, siehe Android Paging
Codelab aus.
PagedListAdapter
In diesem Abschnitt werden alle Änderungen beschrieben, die zum Migrieren einer älteren Paging-Datei erforderlich sind.
Implementierung zur Verwendung der Klassen PagingDataAdapter
oder AsyncPagingDataDiffer
aus Seite 3.
Durch Seite 3 kann PagingDataAdapter
die neue reaktive PagingData
verarbeiten.
Streams. Andernfalls haben PagedListAdapter
und PagingDataAdapter
denselben
. Für die Migration von PagedListAdapter
zu PagingDataAdapter
müssen Sie Folgendes ändern:
Ihre Implementierung von PagedListAdapter
, um stattdessen PagingDataAdapter
zu erweitern.
Weitere Informationen zu PagingDataAdapter
finden Sie unter RecyclerView definieren
Adapter.
AsyncPagedListDiffer
Wenn Sie derzeit eine benutzerdefinierte RecyclerView.Adapter
-Implementierung mit
AsyncPagedListDiffer
, migrieren Sie Ihre Implementierung, um die
Stattdessen wird in Seite 3 die Datei AsyncPagingDataDiffer
angegeben:
Kotlin
AsyncPagingDataDiffer(diffCallback, listUpdateCallback)
Java
new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);
Java
new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);
Weitere Informationen
Weitere Informationen zur Paging-Bibliothek finden Sie in den folgenden zusätzlichen Ressourcen:
Codelabs
Produktproben
- Seitenumbruch für Android-Architekturkomponenten Beispiel
- Seitenwechsel mit Datenbank und Netzwerk in Android-Architekturkomponenten Beispiel
Empfehlungen für dich
- Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- Daten aus Seiten laden und anzeigen
- Auslagerungsdaten erfassen
- Seite aus Netzwerk und Datenbank