Kavramlar ve Jetpack Compose uygulaması
Paging 3, Paging kitaplığının önceki sürümlerinden önemli ölçüde farklıdır. Bu sürüm, gelişmiş işlevsellik sunar ve Paging 2'nin kullanımıyla ilgili yaygın zorlukları giderir. Uygulamanızda Paging kitaplığının daha önceki bir sürümü kullanılıyorsa Paging 3'e geçiş hakkında daha fazla bilgi edinmek için bu sayfayı inceleyin.
Uygulamanızda kullandığınız ilk Paging kitaplığı sürümü Paging 3 ise temel kullanım bilgileri için Sayfalandırılmış verileri yükleme ve görüntüleme başlıklı makaleyi inceleyin.
Paging 3'e geçiş yapmanın avantajları
Paging 3, kitaplığın önceki sürümlerinde bulunmayan aşağıdaki özellikleri içerir:
- Kotlin eş yordamları ve Flow için birinci sınıf destek.
- RxJava
Singleveya GuavaListenableFuturetemel öğeleri kullanılarak eşzamansız yükleme desteği. - Yeniden deneme ve yenileme işlevi de dahil olmak üzere duyarlı kullanıcı arayüzü tasarımı için yerleşik yükleme durumu ve hata sinyalleri.
- İptal desteği ve basitleştirilmiş veri kaynağı arayüzü dahil olmak üzere depo katmanında iyileştirmeler.
- Sunum katmanı, liste ayırıcıları, özel sayfa dönüştürmeleri, yükleme durumu başlıkları ve altbilgilerinde iyileştirmeler yapıldı.
Uygulamanızı Paging 3'e taşıma
Paging 3'e tam olarak geçmek için Paging 2'deki üç ana bileşenin tümünü taşımanız gerekir:
DataSourcesınıfPagedListPagedListAdapter
Ancak bazı Paging 3 bileşenleri, Paging'in önceki sürümleriyle geriye dönük olarak uyumludur. Özellikle Paging 3'teki PagingSource API'si, eski sürümlerdeki LivePagedListBuilder ve RxPagedListBuilder için veri kaynağı olabilir. Benzer şekilde, Pager API, asPagingSourceFactory yöntemiyle eski DataSource nesnelerini kullanabilir. Bu nedenle, aşağıdaki taşıma seçeneklerinden birini kullanabilirsiniz:
DataSourceöğeniziPagingSourceöğesine taşıyabilir ancak sayfalama uygulamanızın geri kalanını değiştirmeden bırakabilirsiniz.PagedListvePagedListAdapteruygulamalarınızı taşıyabilir ancak eskiDataSourceAPI'yi kullanmaya devam edebilirsiniz.- Uygulamanızı Paging 3'e tamamen taşımak için Paging uygulamasının tamamını taşıyabilirsiniz.
Bu sayfadaki bölümlerde, uygulamanızın her katmanındaki Paging bileşenlerinin nasıl taşınacağı açıklanmaktadır.
Taşımaya genel bakış
RecyclerView uygulamanızı korurken Paging 3'e tamamen geçmek için aşağıdaki bileşenleri güncellemeniz gerekir:
Paging 2 Component |
Sayfalandırma 3 Değişimi |
|
|
|
|
|
|
|
|
DataSource sınıf
Bu bölümde, eski bir Paging uygulamasının PagingSource kullanacak şekilde taşınması için gerekli değişiklikler açıklanmaktadır.
Paging 2'deki PageKeyedDataSource, PositionalDataSource ve ItemKeyedDataSource, Paging 3'te PagingSource API'sinde birleştirilmiştir. Eski API sınıflarındaki tüm yükleme yöntemleri, load
yönteminde tek bir PagingSource yöntem olarak birleştirilir. Eski API sınıflarının uygulamalarındaki yükleme yöntemlerinin çoğunda mantık genellikle aynı olduğundan bu, kodun yinelenmesini azaltır.
Tüm yükleme yöntemi parametreleri, Paging 3'te her yükleme türü için alt sınıflar içeren LoadParams kapalı sınıfıyla değiştirilir. load yönteminizde yük türleri arasında ayrım yapmanız gerekiyorsa LoadParams sınıfının hangi alt sınıfının iletildiğini kontrol edin: LoadParams.Refresh, LoadParams.Prepend veya LoadParams.Append.
PagingSource uygulama hakkında daha fazla bilgi edinmek için Veri kaynağı tanımlama başlıklı makaleyi inceleyin.
Anahtarları yenileme
PagingSource uygulamaları, yenilemelerin yüklenen sayfa verilerinin ortasından nasıl devam edeceğini tanımlamalıdır. Bunu yapmak için state.anchorPosition öğesini en son erişilen dizin olarak kullanarak doğru başlangıç anahtarını eşlemek üzere getRefreshKey öğesini uygulayın.
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
Bu bölümde, eski bir Paging uygulamasını Paging 3'te Pager ve PagingData kullanacak şekilde taşımak için gereken tüm değişiklikler açıklanmaktadır.
PagedListBuilder sınıf
PagingData, Paging 2'deki mevcut PagedList ile değiştirilir. PagingData sürümüne geçmek için aşağıdakileri güncellemeniz gerekir:
- Sayfalama yapılandırması
PagedList.ConfigkonumundanPagingConfigkonumuna taşındı. LivePagedListBuilderveRxPagedListBuilder, tek birPagersınıfında birleştirildi.Pager,Flow<PagingData>ile gözlemlenebilir birFlow<PagingData>ortaya çıkarır .flowmülk. RxJava ve LiveData varyantları, uzantı özellikleri olarak da kullanılabilir. Bu özellikler, Java'dan statik yöntemlerle çağrılabilir ve sırasıylapaging-rxjava*vepaging-runtimemodüllerinden sağlanır.
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);
Paging 3'ü kullanarak PagingData nesnelerinin reaktif akışını ayarlama hakkında daha fazla bilgi edinmek için PagingData akışı oluşturma başlıklı makaleyi inceleyin.
PagedListAdapter
Bu bölümde, eski bir Paging uygulamasını Paging 3'teki PagingDataAdapter veya AsyncPagingDataDiffer sınıflarını kullanacak şekilde taşımak için gereken tüm değişiklikler açıklanmaktadır.
Paging 2, PagedList öğesini RecyclerView öğesine bağlamak için PagedListAdapter kullanır. Sayfalama 3'te PagingData, PagedList ile değiştirilir.
Paging 3, yeni PagingData reaktif akışlarını işlemek için PagingDataAdapter sağlar. Aksi takdirde, PagedListAdapter ve PagingDataAdapter aynı arayüze sahiptir. PagedListAdapter'dan PagingDataAdapter'ye geçmek için PagedListAdapter uygulamanızı PagingDataAdapter'yi genişletecek şekilde değiştirin.
PagingDataAdapter hakkında daha fazla bilgi edinmek için Define a RecyclerView
adapter başlıklı makaleyi inceleyin.
AsyncPagedListDiffer
Şu anda RecyclerView.Adapter ile özel bir AsyncPagedListDiffer uygulaması kullanıyorsanız uygulamanızı Paging 3'te sağlanan AsyncPagingDataDiffer kullanacak şekilde taşıyın:
Kotlin
AsyncPagingDataDiffer(diffCallback, listUpdateCallback)
Java (RxJava)
new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);
Java (Guava/LiveData)
new AsyncPagingDataDiffer(diffCallback, listUpdateCallback);