Sayfa 3, Sayfalama kitaplığının önceki sürümlerinden önemli ölçüde farklıdır. Bu sürüm gelişmiş işlevler sunar ve Sayfa 2'nin kullanımıyla ilgili yaygın sorunları ele alır. Uygulamanız zaten Sayfalama kitaplığının önceki bir sürümünü kullanıyorsa Sayfa 3'e geçiş hakkında daha fazla bilgi edinmek için bu sayfayı okuyun.
Sayfa 3, uygulamanızda kullandığınız Sayfalama kitaplığının ilk sürümüyse temel kullanım bilgileri için Sayfalandırılmış verileri yükleme ve görüntüleme konusuna bakın.
3. Sayfaya geçmenin avantajları
Sayfa 3, kitaplığın önceki sürümlerinde mevcut olmayan aşağıdaki özellikleri içerir:
- Kotlin eş yordamları ve Flow için birinci sınıf destek.
- RxJava
Single
veya GuavaListenableFuture
temel öğelerini kullanarak eşzamansız yükleme desteği. - Yeniden deneme ve yenileme işlevleri dahil, duyarlı kullanıcı arayüzü tasarımı için dahili yükleme durumu ve hata sinyalleri.
- İptal desteği ve basitleştirilmiş veri kaynağı arayüzü gibi kod deposu katmanında yapılan iyileştirmeler.
- Sunu katmanı, liste ayırıcıları, özel sayfa dönüşümleri ve yükleme durumu üst ve alt bilgilerinde yapılan iyileştirmeler.
Uygulamanızı 3. Sayfaya taşıyın
Sayfa 3'e tamamen geçiş yapmak için 2. Sayfa'dan üç ana bileşeni de taşımanız gerekir:
DataSource
sınıfPagedList
PagedListAdapter
Ancak bazı Sayfalama 3 bileşenleri, Sayfalama'nın önceki sürümleriyle geriye dönük uyumludur. Özellikle Sayfa 3'teki PagingSource
API, LivePagedListBuilder
ve eski sürümlere ait RxPagedListBuilder
için bir veri kaynağı olabilir. Benzer şekilde, Pager
API, asPagingSourceFactory()
yöntemiyle eski DataSource
nesnelerini kullanabilir. Bu durumda, aşağıdaki taşıma seçeneklerine sahip olursunuz:
DataSource
öğeniziPagingSource
adresine taşıyabilir, ancak çağrı uygulamanızın geri kalan kısmını değiştirmeden bırakabilirsiniz.PagedList
vePagedListAdapter
öğelerinizi taşıyabilir ancak eskiDataSource
API'yi kullanmaya devam edebilirsiniz.- Uygulamanızı Sayfa 3'e tamamen taşımak için Sayfalama uygulamasının tamamını taşıyabilirsiniz.
Bu sayfadaki bölümlerde, uygulamanızın her bir katmanındaki Sayfalama bileşenlerinin nasıl taşınacağı açıklanmaktadır.
DataSource sınıfları
Bu bölümde, daha eski bir Sayfalama uygulamasını PagingSource
kullanmak amacıyla taşımak için gerekli tüm değişiklikler açıklanmaktadır.
Sayfa 2'deki PageKeyedDataSource
, PositionalDataSource
ve ItemKeyedDataSource
, Sayfa 3'teki PagingSource
API'de birleştirilir. Tüm eski API sınıflarındaki yükleme yöntemleri, PagingSource
bölgesinde tek bir load()
yönteminde birleştirilir. Eski API sınıflarının uygulamalarındaki yükleme yöntemlerindeki mantığın büyük bir kısmı genellikle aynı olduğundan kod tekrarını azaltır.
Sayfa 3'te tüm yükleme yöntemi parametreleri, her yükleme türü için alt sınıfları içeren LoadParams
işaretli bir sınıfla değiştirilir. load()
yönteminizde yük türleri arasında ayrım yapmanız gerekiyorsa hangi LoadParams
alt sınıfının iletildiğini kontrol edin: LoadParams.Refresh
, LoadParams.Prepend
veya LoadParams.Append
.
PagingSource
uygulamasını uygulama hakkında daha fazla bilgi edinmek için Veri kaynağı tanımlama bölümüne bakın.
Anahtarları yenile
PagingSource
uygulamaları, yenilemelerin yüklenen sayfa bölümü içeren verilerin ortasından nasıl devam edeceğini tanımlamalıdır. Bu işlemi, en son erişilen dizin olarak state.anchorPosition
kullanıp doğru başlangıç anahtarını eşlemek için getRefreshKey()
uygulayın.
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; }
Dönüşümleri listeleme
Sayfalandırma kitaplığının eski sürümlerinde sayfalandırılmış verilerin dönüşümü aşağıdaki yöntemlere dayanır:
DataSource.map()
DataSource.mapByPage()
DataSource.Factory.map()
DataSource.Factory.mapByPage()
3. Sayfa'da, tüm dönüşümler PagingData
üzerinde operatör olarak uygulanır. Sayfalı listenizi dönüştürmek için önceki listede yer alan yöntemlerden herhangi birini kullanırsanız yeni PagingSource
kullanarak Pager
oluştururken dönüşüm mantığınızı DataSource
konumundan PagingData
öğesine taşımanız gerekir.
Sayfa 3'ü kullanarak sayfalandırılmış verilere dönüşüm uygulama hakkında daha fazla bilgi edinmek için Veri akışlarını dönüştürme bölümüne bakın.
Sayfalı Liste
Bu bölümde, Sayfa 3'te Pager
ve PagingData
kullanmak üzere eski bir Sayfalama uygulamasını taşımak için gerekli tüm değişiklikler açıklanmaktadır.
PagedListBuilder sınıfları
PagingData
, Sayfa 2'deki mevcut PagedList
öğesinin yerini alır. PagingData
ürününe taşımak için aşağıdakileri güncellemeniz gerekir:
- Sayfalandırma yapılandırması,
PagedList.Config
konumundanPagingConfig
konumuna taşındı. LivePagedListBuilder
veRxPagedListBuilder
tek birPager
sınıfında birleştirildi.Pager
,.flow
özelliğiyle gözlemlenebilir birFlow<PagingData>
sunuyor. RxJava ve LiveData varyantları, uzantı özellikleri olarak da mevcuttur. Bunlar, statik yöntemlerle Java'dan çağrılabilir ve sırasıylapaging-rxjava*
vepaging-runtime
modüllerinden sağlanır.
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);
Çağrı 3'ü kullanarak PagingData
nesnelerinin reaktif bir akışını ayarlama hakkında daha fazla bilgi edinmek için PagingData akışı oluşturma konusuna bakın.
Katmanlı kaynaklar için BoundaryCallback
3. Sayfalama'da RemoteMediator
, ağ ve veritabanından sayfalama için işleyici olarak PagedList.BoundaryCallback
yerine geçer.
Sayfa 3'te ağ ve veritabanından sayfaya RemoteMediator
kullanımı hakkında daha fazla bilgi edinmek için Android Sayfalama codelab'ine bakın.
Sayfa Listesi Bağdaştırıcısı
Bu bölümde, daha eski bir Sayfa 3 uygulamasını PagingDataAdapter
veya AsyncPagingDataDiffer
sınıflarını kullanacak şekilde taşımak için gerekli tüm değişiklikler açıklanmaktadır.
3. sayfa, yeni PagingData
reaktif akışlarının işlenmesi için PagingDataAdapter
sağlar. Aksi takdirde, PagedListAdapter
ve PagingDataAdapter
aynı arayüze sahip olur. PagedListAdapter
ürününden PagingDataAdapter
aboneliğine geçiş yapmak için PagedListAdapter
uygulamanızı, bunun yerine PagingDataAdapter
kapsamını genişletecek şekilde değiştirin.
PagingDataAdapter
hakkında daha fazla bilgi edinmek için RecyclerView adaptörü tanımlama bölümüne bakın.
Eş ZamansızSayfalıListefarkı
Şu anda AsyncPagedListDiffer
ile özel bir RecyclerView.Adapter
uygulaması kullanıyorsanız uygulamanızı Sayfa 3'te sağlanan AsyncPagingDataDiffer
kullanacak şekilde taşıyın:
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 uygulamaları
Sana Özel
- Android Mimari Bileşenleri Sayfa örneği
- Veritabanı ve Ağ örneğiyle Android Mimarisi Bileşenleri Sayfalama
Sizin için önerilenler
- Not: Bağlantı metni JavaScript kapalıyken gösterilir
- Sayfalı verileri yükleme ve görüntüleme
- Sayfalandırılmış verileri toplama
- Ağ ve veritabanı sayfası