Zu Paging 3 migrieren

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 Guava ListenableFuture 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 Kurs
  • PagedList
  • 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 zu PagingSource migrieren, den Rest Ihrer Paging-Implementierung unverändert.
  • Sie können Ihre PagedList und PagedListAdapter migrieren, aber weiterhin die ältere DataSource 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 nach PagingConfig verschoben.
  • LivePagedListBuilder und RxPagedListBuilder wurden zu einem einzelne Pager-Klasse.
  • Pager stellt eine beobachtbare Flow<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 Modul paging-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