Android Paging 3

Bir Android projesinde RecyclerView ile listeleme işlemini yapabiliriz. Küçük boyutlu listeler gösterebildiğimiz gibi liste elemanlarının fazla olduğu listeleri de RecyclerView üzerinde gösterebiliriz. Büyük boyutlu liste elemanlarının hepsini aynı anda göstermek efektif bir çözüm olmayacaktır. Listeyi parçalar halinde alıp göstermek daha uygun ve performanslı bir çözüm olacaktır. İşte burada paging devreye girer.

Paging, Android Jetpack içerisinde bulunan ve verileri istenen büyüklükteki parçalar halinde gösterebilmemizi sağlayan bir componenttir. Paging 3 önceki versiyonlarından farklı olarak tamamıyla Kotlin ile yazılmıştır ve Kotlin Coroutines kullanmaktadır. Coroutines Flow yapısını desteklediği gibi RxJava ve LiveData desteği de bulunmaktadır. Bunun yanında error handling ve loading, fail, success gibi state kontrolü, caching gibi birçok özelliği de bulunmaktadır.

Kurulum

Projenizde Paging 3 kullanmak için app/build.gradle içerisine alltaki gibi dependencyleri ekliyoruz.

Eğer RxJava ile kullanmak istiyorsanız alttaki dependencyleri de eklemelisiniz.

DataStore

Öncelikle verilerin sayfalar halinde alınabilmesi için bir DataSource oluşturmamız gerekiyor.

Burada oluşturduğumuz DataSource classını PagingSource<Key, Value> classından türettik. PagingSource iki adet parametre almaktadır. Key sayfa numarasını temsil ederken, Value ise model classını temsil etmektedir.

Üstte gördüğünüz gibi load() metodu bir suspend metoddur. Bu metod içerisinde network istekleri ya da database çağırımları yapılabilir. Örnekte MovieApiService içerisindeki getPopularMovies(page: Int) metodunu load() metodu içerisinde çağırdık.

LoadParams objesi key ve sayfa numarası gibi değerler tutar. Bu sayede sayfa sayısına göre istekler gönderilmiş olur.

API tarafından dönen değerin success durumunda LoadResult.Page, fail olma durumunda ise gelen datalar LoadResult.Error objeleriyle wrap edilir.

Not: Eğer RxJava kullanıyorsanız oluşturduğumuz DataSource classını RxPagingSource classından extend etmelisiniz.

ViewModel

Oluşturulan PopularMoviesPagingSource classından gelen dataları ViewModel üzerinde almayı alttaki gibi yapabiliriz.

Pager objesi PopularMoviesPagingSource içerisindeki load() metodunu çağırır. Ayrıca PagingConfig objesinde verilen pageSize değerine göre liste elemanları getirilir.

Biz bu örnekte Flow ile çalıştığımız için .flow kullandık. Eğer LiveData olarak expose etmek istiyorsanız .liveData, RxJava için Flowable kullanıyorsanız .flowable, Observable kullanıyorsanız .observable kullanabilirsiniz.

RecyclerView üzerinde gösterme

Şimdi de aldığımız dataları RecyclerView üzerinde nasıl gösteririz buna bakalım.

Normal RecyclerView adapterden farkı PagingDataAdapter classından extend edilmiş olmasıdır. PagingDataAdapter 2 parametre alır, birincisi model classı ikinci ise ViewHolder’dır.

Son olarak listeyi Activity/Fragment üzerinde göstereceğiz.

Artık veriler RecyclerView üzerinde parçalar halinde kullanıcı liste sonuna geldiğinde listelenecektir.

Ek olarak her parça liste çağrısı yapıldığında stateleri kontrol edebilmek için RecyclerView adapter içerisindeki addLoadStateListener metodu kullanılabilir.

Referanslar

https://developer.android.com/topic/libraries/architecture/paging/v3-overview

https://proandroiddev.com/how-to-use-the-paging-3-library-in-android-5d128bb5b1d8

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.