3. Sayfaya Taşı

Sayfa 3, Sayfalama kitaplığının önceki sürümlerinden önemli ölçüde farklıdır. Bu sürüm gelişmiş işlevler sağlar ve yaygın olarak kullanılan adresler Sayfa 2’yi kullanmayla ilgili zorluklar. Uygulamanızda zaten daha eski bir sürümüne geçiş yapabilirsiniz. Daha fazla bilgi için bu sayfayı okuyun Sayfa 3.

Sayfa 3, kullandığınız Sayfalandırma kitaplığının ilk sürümüyse hakkında daha fazla bilgi edinmek için Sayfaları yükleme ve görüntüleme verileri temel kullanım için ekleyebilirsiniz.

Sayfa 3'e geçmenin avantajları

Sayfa 3, daha önce bulunmayan aşağıdaki özellikleri içerir sürümleri için de ekleyebilirsiniz:

  • Kotlin eş yordamları ve Akışı için birinci sınıf destek.
  • RxJava Single veya Guava ListenableFuture kullanarak eşzamansız yükleme desteği ilkel maddelerdir.
  • Duyarlı kullanıcı arayüzü tasarımı için yerleşik yükleme durumu ve hata sinyalleri: tekrar deneyin ve yenileyin.
  • İptal desteği ve basitleştirilmiş veri kaynağı arayüzü.
  • Sunu katmanı, liste ayırıcılar, özel sayfada yapılan iyileştirmeler ile durum üstbilgilerini ve altbilgilerini yükleyebilirsiniz.

Uygulamanızı Sayfa 3'e taşıyın

Sayfa 3'e tam olarak geçmek için ana bileşenlerin üçünü de taşımanız gerekir Sayfa 2'den:

  • DataSource sınıf
  • PagedList
  • PagedListAdapter

Ancak, Sayfalandırma 3 bileşenlerinin bazıları önceki sürümlerle geriye dönük olarak uyumludur sürümlerinde yer alır. Özellikle, Sayfalama'dan PagingSource API 3, proje yöneticisi olarak LivePagedListBuilder ve RxPagedListBuilder eski sürümlerden birini seçin. Benzer şekilde, Pager API eski verileri de kullanabilir DataSource nesne asPagingSourceFactory() yöntemi. Bu, aşağıdaki niteliklere sahip olduğunuz anlamına gelir: taşıma seçenekleri:

  • DataSource veri türünüzü PagingSource hizmetine taşıyabilirsiniz ancak Sayfalandırma uygulamasında değişiklik yapılmadı.
  • PagedList ve PagedListAdapter öğelerinizi taşıyabilirsiniz ancak daha eski DataSource API.
  • Uygulamanızı tamamen Sayfa 3.

Bu sayfadaki bölümlerde, her bir katmandaki Sayfalandırma bileşenlerinin nasıl taşınacağı açıklanmaktadır. en iyi yoludur.

DataSource sınıfları

Bu bölümde, eski bir Sayfalama'yı taşımak için gereken tüm değişiklikler açıklanmaktadır PagingSource kullanımı.

PageKeyedDataSource, PositionalDataSource ve ItemKeyedDataSource ve Sayfa 2'deki tüm sayfalar, Sayfa 3'te PagingSource API'de birleştirilir. İlgili içeriği oluşturmak için kullanılan tüm eski API sınıflarındaki yükleme yöntemleri tek bir sayfada birleştirilir. PagingSource konumunda load() yöntemi. Bu, çoğu durumda kod tekrarlarını eski API sınıflarının uygulamalarındaki yükleme yöntemlerinin mantığı genellikle aynıdır.

Tüm yükleme yöntemi parametreleri, Sayfa 3'te LoadParams ile değiştirilir her yük türü için alt sınıflar içeren mühürlü sınıf. Gerekirse load() yönteminizde yük türlerini birbirinden ayırt edebilmek için LoadParams alt sınıfı geçildi: LoadParams.Refresh, LoadParams.Prepend veya LoadParams.Append.

PagingSource öğesini uygulama hakkında daha fazla bilgi edinmek için Veri tanımlama bölümüne bakın. kaynak değerleridir.

Tuşları yenile

PagingSource uygulamaları, yenilemelerin ortaya koyun. Bu işlemi, getRefreshKey() state.anchorPosition doğru ilk anahtarı, en son erişilen dizin.

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;
}

Dönüşümleri listeleme

Sayfalandırma kitaplığının eski sürümlerinde, sayfalandırılmış verilerin dönüştürülmesi aşağıdaki yöntemlerde kullanılabilir:

  • DataSource.map()
  • DataSource.mapByPage()
  • DataSource.Factory.map()
  • DataSource.Factory.mapByPage()

Sayfa 3'te, tüm dönüşümler PagingData üzerinde operatör olarak uygulanır. Eğer sayfalı listenizi dönüştürmek için önceki listede bulunan yöntemlerden herhangi birini kullanıyorsanız dönüştürme mantığınızı DataSource öğesinden Yeni PagingSource öğenizi kullanarak Pager oluştururken PagingData.

Sayfa 3'ü kullanarak sayfalandırılmış verilere dönüşüm uygulama hakkında daha fazla bilgi edinmek için bkz. Veri akışlarını dönüştürün.

Sayfalı Liste

Bu bölümde, eski bir Sayfalama'yı taşımak için gereken tüm değişiklikler açıklanmaktadır 3. Sunum'da Pager ve PagingData kullanmak için uygulama.

PagedListBuilder sınıfları

PagingData, Sayfa 2'deki mevcut PagedList öğesinin yerini alır. Şuraya taşımak için: PagingData, aşağıdakileri güncellemeniz gerekiyor:

  • Sayfalandırma yapılandırması PagedList.Config konumundan PagingConfig konumuna taşındı.
  • LivePagedListBuilder ve RxPagedListBuilder birleştirildi tek Pager sınıfı.
  • Pager, .flow özelliğiyle gözlemlenebilir bir Flow<PagingData> sunar. RxJava ve LiveData varyantları, uzantı özellikleri olarak da kullanılabilir. statik yöntemlerle Java'dan çağrılabilir ve Sırasıyla paging-rxjava* ve paging-runtime modülleri.

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);

Şu komutu kullanarak PagingData nesnenin reaktif akışını ayarlama hakkında daha fazla bilgi edinmek için: Sayfa 3, bkz. PagingData.

Katmanlı kaynaklar için BoundaryCallback

Sayfa 3'te, RemoteMediator şunları değiştirir: Ağdan ve veritabanından sayfa oluşturma için işleyici olarak PagedList.BoundaryCallback.

Şu sayfadaki ağ ve veritabanından sayfada RemoteMediator kullanma hakkında daha fazla bilgi: 3. sayfa, bkz. Android Çağrısı codelab'i tıklayın.

Sayfa Listesi Adaptörü

Bu bölümde, eski bir Sayfalama'yı taşımak için gereken tüm değişiklikler açıklanmaktadır PagingDataAdapter veya AsyncPagingDataDiffer sınıflarını kullanmak için uygulama Sayfa 3'ten.

3. sayfa, yeni PagingData reaktifini işlemek için PagingDataAdapter sağlar akışlar. Aksi takdirde PagedListAdapter ve PagingDataAdapter aynı olacaktır kullanır. PagedListAdapter ürününden PagingDataAdapter aboneliğine taşımak için şunu değiştirin: PagingDataAdapter kapsamını genişletmek için PagedListAdapter uygulamanız.

PagingDataAdapter hakkında daha fazla bilgi edinmek için bkz. RecyclerView tanımlama bağdaştırıcıyı kullanın.

Eş ZamansızSayfalıListeDiffer

Şu andaRecyclerView.Adapter AsyncPagedListDiffer, Bunun yerine Sayfa 3'te AsyncPagingDataDiffer sağlanmıştır:

Kotlin

AsyncPagingDataDiffer(diffCallback, listUpdateCallback)

Java

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);

Java

new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);

Ek kaynaklar

Sayfalama kitaplığı hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın:

Codelab'ler

Örnekler

ziyaret edin. ziyaret edin.