Paging3 Kullanarak Huawei Site Kit’te Pagination Yapımı
Selamlar, bu yazımızda Android’in Paging3 kütüphanesiyle Huawei Site Kit’ten verilerimizi çekerek Android Studio’da Kotlin kullanarak nasıl Pagination (Sayfalama) yapabileceğimizi keşfedeceğiz. Paging3 kütüphanesi bize pagination için genel bir çözüm sunmakta olup, networkten veya yerel bir kaynaktan verilerimizi çekip kullanıcıya göstermemize yarıyor. Biz de örneğimizde veri kaynağı olarak Site Kit’i kullandık.
Neden Pagination’a İhtiyaç Duyuyoruz?
Pagination bize herhangi bir kaynaktan veri alırken, bu verileri küçük parçalar halinde sunuyor. Bunun sonucu olarak da bütün veriyi gereksiz yere çekmiş olmuyoruz. Bu da gereksiz network isteklerimizi ve sistem kaynakları kullanımımızı azaltıyor.
Paging3 Kütüphanesi Nedir?
Paging3 Kütüphanesi Android Jetpack bileşenlerinin bir parçası olarak büyük verileri parçalar halinde çekip, kullanıcıya gösteriminde bize yardımcı olan Android’in resmi bir kütüphanesidir.
Aşağıda kütüphanenin çeşitli özelliklerini listeledik;
- Kotlin Coroutines, Flow, RxJava ve LiveData yapılarını tamamen desteklemektedir.
- RecyclerView ile bütünleşik olarak çalışmaktadır.
- İçerisinde bulunan cache(önbellek) tutma mekanizması sayesinde gereksiz yere istek yapmayarak sistem kaynaklarını optimize şekilde kullanmamıza yardımcı oluyor.
- Hata işleme ve sayfa yenileme işlemlerinde bize çok büyük kolaylıklar sağlıyor.
Huawei Site Kit
Site Kit ile konumumuza göre yer-mekan aramaları yapabiliyoruz. Bu aramaları yaparken de anahtar kelime ile arama, ayrıntılı yer araması ve önerilen yer araması gibi seçenekler ile filtreleyebiliyoruz.
Biz bu yazımızda Site Kit’in bir projeye nasıl eklenebileceği ile ilgili detaylara değinmeyeceğiz. Resmi dökümanı ya da codelab aracılığıyla adım adım Site Kit’i projemize nasıl ekleyebileceğimizi görebiliriz.
Örnek Pagination Projemiz
Bu örnek projemizde kullanıcılara yakınlarında bulunan yerlerin listesini ve bize uzaklıklarını gösteren bir uygulama geliştireceğiz.
- Sol taraftaki görüntüde projemizin paket mimarisini görebilirsiniz.
- Biz uygulamamızda MVVM mimarisini ve güncel Android kütüphanelerini kullanmayı tercih ettik.
Projenin Kurulumu
İlk olarak build.gradle (app level) dosyamızda gerekli implementasyonlarımızı yazalım.
Layout Dosyaları
activity_main.xml dosyamızda, kullanıcılara yakınlarındaki yerleri göstermek için RecyclerView, verilerin yükleme aşamasını göstermek için ProgressBar ve herhangi bir hatada yeniden veri çekme işlemini yapabilmemiz için bir Retry butonu bulunuyor.
item_site.xml -> RecyclerView için ihtiyacımız olan item dosyası aşağıda yer alıyor.
Model
Uygulamamızda 2 tane model sınıfımız yer alıyor. Bunlar Site ve Result sınıfları. Site sınıfı halihazırda Site Kit’in bir parçası olduğu için bunu kendimiz oluşturmuyoruz.
Result.kt -> Result, Success ve Error data classlarını içeren bir wrapper class. Karşılaştığımız duruma göre iki classtan birini kullanabiliyoruz.
Veri Kaynaklarımız
Veri gösterimi yapabilmek için en az bir tane veri kaynağına ihtiyacımız var. Yukarıda değindiğimiz gibi biz veri kaynağı olarak Site Kit’i kullanacağız. Çevremizdeki yerlerin listesini alabilmek için Site Kit’in NearbyLocation özelliğini kullandık. Konumumuz olarak ise Eyfel Kulesi yakınlarından sahte bir yerleşim yeri seçtik.
HuaweiSiteSource.kt -> getNearbyPlaces() fonksiyonu yardımıyla çevremizdeki yerlerin listesini alabiliyoruz. Bu suspend fonksiyonumuz sayfa sayısını parametre olarak alıyor. Eğer isteğimiz başarılı olursa Result.Success içerisinde bir yer listesi döndürüyor, hata alırsak da Result.Error içerisinde karşılaştığımız hata mesajını döndürüyor. Sealed class kullanarak her iki senaryoda da başarılı şekilde isteğimizi gerçekleştirmiş oluyoruz.
Sonrasında SitePagingSource.kt dosyamızı oluşturuyoruz ve PagingSource<Key, Value> implementasyonunu yapıyoruz. PagingSource Key ve Value olarak iki parametre alıyor. Key değeri olarak sayfamızın indeks numarasını, Value olarak da verimizin tipini yapıyoruz. Bu sebeple sayfa numarası olarak Int, veri tipi olarak da Site tipini verdik.
PagingSource’u kullanabilmemiz için load() ve getRefreshKey() fonksiyonlarını override etmemiz gerekiyor. Buraya şu notu da eklemekte fayda var; eğer Paging kütüphanesinin “3.3.0-alpha13" sürümünden önceki versiyonlarından birini kullanıyorsanız getRefreshKey() fonksiyonunu override etmeniz zorunlu değil.
load() fonksiyonuna dikkat edersek bunun bir suspend fonksiyon olduğunu görürüz. Yani Coroutines’in de yardımıyla burada network ve yerel veritabanımızdan isteklerimizi main thread’i bloklamadan yapabiliriz.
getRefreshKey() PagingSource’un yenilenmesiyle birlikte bir sonraki sayfalama işlemi için bize key sağlıyor. Son erişilen pozisyona ise state.anchorPositions
ile erişebiliyoruz.
HuaweiRepository.kt -> getDefaultPageConfig() fonksiyonu bize sayfa boyutunu(her sayfada yüklenecek item sayısı), placeholderları, ilk yükleme boyutu gibi seçenekleri ayarlamamızı sağlıyor.
getSiteListAsFlow() fonksiyonu da SitePagingSource içerisinden load() metodunu çağırarak verileri elde etmemize ve flow aracılığıyla da bu verileri aktarmamıza yardımcı oluyor.
ViewModel
MainViewModel.kt -> fetchSiteList() fonksiyonu ile verilemizi çekip, ekran döndürme gibi konfigürasyon değişikliklerinde dahi verimizi korumak amacıyla cache işleminini gerçekleştirebiliyoruz.
Çektiğimiz bu verilerin View üzerinde gösterimine geçmeden önce RecyclerView Adapter’dan bahsetmek istiyorum. Paging3, listelemeyi kullanırken kendine özel bir Adapter kullanıyor.
SiteAdapter.kt -> Burada sınıfımızı PagingDataAdapter sınıfından extend ediyoruz. Bu da iki parametre alıyor; bir Model sınıfı (Site) ve bir ViewHolder (SiteViewHolder). Ayrıca daha hızlı ve daha güvenli olduğundan verilerimiz ile UI elemanlarımızı birbirlerine bağlamak için ViewBinding kullanmayı tercih ettik. Listelediğimiz yerlerin üzerlerine tıklama işlemlerini yapmak için de Higher-order fonksiyonların özelliklerinden yararlandık.
View
MainActivity.kt -> İlk olarak RecyclerView ve SiteAdapter için gerekli ayarlamalarımızı yapalım. Sonrasında, ViewModel’dan çekmiş olduğumuz verilerimizi adapter aracalığıyla RecyclerView’da gösterelim. Son olarak da addLoadStateListener() metodu yardımıyla adapter durmumuzu gözlemleyelim. Bu metod, eğer adapter durumunda bir değişiklik olursa, bizi uyaracak. İlgili duruma göre de UI’ımızda verilerimizi gösterebilir, yüklendiğini bildirebilir ya da yükleme işlemi sırasında bir hata gerçekleştiyse kullanıcıya tekrar denemesi için bir buton gösterebiliriz.
Sonuç
Özet olarak, kullanıcılara çevrelerindeki mekanların isimlerini ve uzaklıklarını gösteren basit bir uygulama geliştirdik. Verilerimizi Huawei Site Kit tarafından aldık, Paging3 kütüphanesi ile de kolayca bu verilerin gösterimini sağladık. Karşılaştığınız sorunları veya sorularınızı yorum olarak yazabileceğiniz gibi aşağıdaki bağlantı aracılığıyla Huawei Geliştirici Forumu üzerinden de sorabilirsiniz.
Zaman ayırdığınız için teşekkürler, umarım yararlı olmuştur. Bir sonraki yazımızda görüşmek üzere…