Android Paging 3 ile Room Database Sayfalama — Pagination

Ramazan Öğünç
Mobillium
Published in
3 min readApr 29, 2022

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ğız.

Ş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ıklar

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ızı yazıyoruz. (Ben dependency injection kullandım. Siz tabi ki kendi ihtiyacınıza göre kullanmayabilirsiniz.)

Viewmodel

Viewmodel sınıfımızda en önemli olan kısım Fonksiyonun veya değişkeninizin dönüş tipinin aşağıdaki gibi olması.
PagingConfig içerisine her sayfada olmasını istediğimiz öge 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.

Extra kodlar

“textChangeDelayedListener” kendi yazdığım bir extension fonksiyon. İsmi üzerinde içerisine verdiğimiz milisaniye sonra tetiklenen bir textchangelistenner’dan 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üklemeye çalışıyor. Sayfalama yapmanın bir anlamı kalmıyor yani.
Bunu keşfetmek benim birkaç saatimi almıştı 😁. Sizin de birkaç saatinizi almaması 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 PagingSource 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 🥳

--

--