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
Singleoder GuavaListenableFuturePrimitiven. - 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:
DataSourceKursPagedListPagedListAdapter
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
DataSourcezuPagingSourcemigrieren, den Rest Ihrer Paging-Implementierung unverändert. - Sie können Ihre
PagedListundPagedListAdaptermigrieren, aber weiterhin die ältereDataSourceAPI. - 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, User>): String? { return state.anchorPosition?.let { anchorPosition -> state.getClosestItemToPosition(anchorPosition)?.id } } // Replacing PositionalDataSource. override fun getRefreshKey(state: PagingState<Int, User>): Int? { return state.anchorPosition }
Java
// 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
// Replacing ItemKeyedDataSource. @Nullable @Override String getRefreshKey(state: PagingState<String, User>) { Integer anchorPosition = state.anchorPosition; if (anchorPosition == null) { return null; } return state.getClosestItemToPosition(anchorPosition); } // Replacing PositionalDataSource. @Nullable @Override Integer getRefreshKey(state: PagingState<Integer, User>) { 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.ConfignachPagingConfigverschoben. LivePagedListBuilderundRxPagedListBuilderwurden zu einem einzelnePager-Klasse.Pagerstellt 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