Android Paging 3 ile Room Database Sayfalama – Pagination

Android Paging 3 ile Room Database Sayfalama — Pagination

Herkese selamlar. Bu yazımızda Google’un sayfalama için yayınladığı paging 3 kütüphanesi ile room db üzerinde sayfalama işlemini nasıl yapabileceğimizi anlatacağım. Şimdiden keyifli okumalar.

Sayfalama-Pagination Nedir ?

Mobil uygulamalarda sayfalama listelenen verilerde, verilerin tamamının tek seferde yüklenmesi yerine. Kullanıcı listenin sonuna geldikçe yüklenmesi olayıdır.

Sayfalamanın hangi durumlarda yapılması gereklidir ?

Sayfalama aynı anda yüzlerce hatta binlerce veri getiren listelemelerde yapılması bir zorunluluk teşkil etmektedir. Aksi takdirde uygulama kullanılamaz halde yavaşlayabilir hatta crash dahi olabilmektedir.

Bu yazı içeriğinde de room db’den paging 3 kütüphanesini kullanarak sayfalı veri çekeceğiz. Uygulayacağımız senaryo şöyle;

  1. Kullanıcı arama metini girecek.
  2. Arama metini veri tabanında arayacağız.
  3. Arama sonuçlarını sayfalama yaparak recyclerview’de listeleyeceğiz.

Yapı Nasıl?

paging 3 mimarisi
paging 3 database yapısı

Üstteki fotoğraflarda paging 3 kütüphanesinin mimarisini görebilirsiniz. Şimdi kodlara geçelim.

Bağımlılıkar

Bağımlılıkları ekliyoruz. Ancak burada dikkat etmemiz gereken bir kısım var. room için özel geliştirilmiş paging bağımlılığını eklemeyi unutmamalıyız. Aksi takdirse uygulama çalışırken exception fırlatıp bu bağımlılığı eklememizi isteyecektir.

Adapter

Burada dikkat etmemiz gereken husus kullandığımız adaptörün PagingDataAdapter olmasıdır. Bu adaptör bize PagingSource olan veri kaynağını kullanabilmemizi sağlıyor ve içerisinde bir takım sayfalama ile ilgili işleri yapmaktadır.

Dao

Burada benim sql sorgumun uzun ver karmaşık olması sizi korkutmasın. Çünkü o benim kendi veri tabanı yapımdan kaynaklı 🙂. Burda önemli kısım sorgunun en sonundaki arama kısmı ve veri dönüş tipinin PagingSource<Int, VeriTipi> olması.

Repository

Repository kodlarımı yazıyoruz. (Ben dependency injection kullandım. Siz tabiki kendi ihtiyacınıza göre kullanmayabilirsiniz.)

Viewmodel

Viewmodel sınıfımızda en öneli olan kısım Fonksiyonun veya değişkeninizin dönüş tipinin Aşağıdaki gibi olması.
PaginConfig içerisine her sayfada olmasını istediğimiz öğe sayısını yazıyoruz.

Fragment veya Activity

Tüm kodlarımızı yazdık. Artık en keyifli olan son kısıma geldik. Burada tüm fragment sınıf kodlarını koyup sizi boğmayacağım. Sadece gerekli kısımları göstereceğim.
Adaptörü ve viewmodel i önceden hazırladığınızı varsayarak ilerliyorum.

Buradaki job kullanmamızın sebebi arama yapıldığını henüz sonucu gelmeden 2. bir arama gerçekleşirse 1. arama sonucu ile 2. arama sonucunun karışmaması için önceki olan arama işini iptal ediyoruz.

Lifecyclescope kullanmamızın sebebi ise Flow’u lifecycle’a duyarlı bir şekilde kullanmak için.

Extra kodlar

“textChangeDelayedListener” kendi yazdığım bir extension fonksiyon. İsmi üzerinde içerisine verdiğimiz milisaniye sonra tetiklenen bir textchangelistennerdan başka bir şey değil aslında. Kodları şöyle

Önemli Not !!

Nested scroll view içerisinde recyclerview kullanıyorsanız. Paging kütüphanesi bunu desteklemiyor. Tüm sayfaları aynı anda yükleme çalışıyor. Sayfalama yapmanın bir anlamı kalmıyor yani.
Bunu keşfetmek benim birkaç saatimi almıştı 😁. Sizin de birkaç saatinizi almamsı için paylaşmak istedim 🙂

Peki ya Sayfalamayı Room db ile değil de Apide (Retrofit’de) yapmak istersek ?

paging 3 remote+databse yapısı

Böyle bir ihtiyacımızda ise. Üstteki yapıyı aynı şekilde kullanabiliyoruz. Sadece Viewmodel’de Pager üretirken PagingSoruce yerine RemoteMediator veriyoruz. Örnek bir RemoteMediator kodunu da şuraya iliştireyim.

Bu bilgiler bana yetmedi derseniz benim de bu yazıyı hazırlarken kullandığım Google’un Paging 3 dökümanını inceleyebilirsiniz. Döküman linki aşağıda 😊

Böylece yazımızın sonuna geldik. İyi geliştirmelerrr 🥳

Kaynaklar


Yorumlar

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site reCAPTCHA ve Google tarafından korunmaktadır Gizlilik Politikası ve Kullanım Şartları uygula.

The reCAPTCHA verification period has expired. Please reload the page.