Custom ArrayAdapter Nasıl Yazılır?

Bir önceki Explicit Intent Nasıl Yazılır? ve ListView ile ArrayAdapter Nasıl Yazılır? isimli yazılarımı okumanız tavsiye ederim. Zira burada verilmiş olan örnekler ve anlatım işaret ettiğim yazılar üzerinden gerçekleştirilecektir.

Ana sayfadan (MainActivity) yönlendirildiğimiz bütün aktivitelerde tek bir ListView olduğunu söylemiştik. Buna göre XML tasarımı aynı bir önceki yabancidil.xml gibi aynı olacaktır. Sadece ListView’e vereceğimiz id’yi değiştireceğiz.

Yine YabanciDil.java’da olduğu gibi ListView’i deklare(beyan) edip, id’si ile bularak atamasını yapıyoruz.

ListView’i tanıttıktan sonra ihtiyacımız olan üç unsuru hatırlarsak;

  1. Verimizin saklı olduğu bir ArrayList,
  2. TextView’den oluşan satırımız (görsel kalıbımız) için bir XML dosyası,
  3. ArrayList’deki verinin ListView’deki bir satıra nasıl yerleştirileceğini söyleyen bir adaptördür.

İlk adım verimizin saklı olduğu ArrayList’i oluşturmaktı. Ancak bu ArrayList String, Integer gibi sınıflardan nesneler saklamak yerine, kendi tanımladığımız sınıftan nesneler tutabilir. Bunun için “Renk” isminde bir sınıf tanımlayalım.

Renk sınıfı turkceRenk ve ingilizceRenk isimli iki String değişkenine(field) sahip olsun. Buna göre de yapılandırıcısını ve get() metotlarımızı yazdık.

Şimdi ilk adımdaki, verimizin saklanacağı ArrayList’i oluşturabiliriz. Generic olarak “Renk” veri tipini belirtiyoruz.

Bir Renk nesnesi oluştururken; yapılandırıcının bizden sırasıyla beklediği, Türkçe ve İngilizce renk isimlerini temsil eden iki String’i kullanıyoruz.

İkinci adımda bu defa; Renkler aktivitesindeki ListView satırını, Android’in bize sunduğu tek bir TextView’den oluşan standart kalıpları (android.R.layout.simple_item_1 gibi (daha önce kullandığımız)) kullanmak yerine özelleştirme yapıyoruz(customize).

Yeni bir layout oluşturalım ve ismine satirkalibi diyelim.

Projede yeni aktivite açmayı bilmeyenler :
” app/res/layout/ SAĞ TIK – NEW – XML – LAYOUT XML FILE ”
diyerek yeni bir layout dosyası oluşturmuş olurlar.

Bu XML satırkalıbımız yan yana farklı iki TextView’den oluşsun. Bunlardan soldakine Türkçe renk adını, sağdakine İngilizce renk adını yazacak olalım.

Üçüncü adımda ise; ArrayList’te saklanan kendi tanımladığımız nesnelerin içinde saklı olan veriyi (her nesnedeki Türkçe ve İngilizce renk adlarını), özelleştirilmiş satırkalıbımıza nasıl yerleştirileceğini söyleyen bir Adaptör oluşturmalıyız.

Ancak bu işlem için; ArrayList’deki nesnelerin ait olduğu sınıf ve satırkalıbımızı özelleştirdiğimiz için, özel(custom) bir adaptör sınıfı tanımlayacağız. Bu sınıf ArrayAdapter sınıfının alt sınıfı olacaktır ve getView() metodunu override edecektir.

Özelleştirdiğimiz Adaptör sınıflarında kullanacağımız yapılandırıcı hep aynı olacaktır(3.Satır).

Bu aşamada bizim için önemli olan getView() metodunu doldurmaktır(7. ve 13. satırlar arası).

Neden Custom Adapter Kullanıyoruz ?

  • ListView ve ArrayAdapter (veya alt sınıfı) kullanmamızın temel amacı ekrandaki görülmesi gereken satırları (Java karşılığı nesne) yeniden kullanabilmesidir.
  • Bir başka ifadeyle ekranı kaydırdığımızda; ekran görüntüsünden çıkan satırların Java temsili olan nesneyi yok etmiyoruz. Bunu ekrana yeni giren satır olarak gösteriyor ve satır içini; yeni satırın sırasına göre veriyi saklayan listemizdeki elemanla dolduruyoruz.

Örneğin 6 satırımız görünüyor olsun. Bunları 0’dan sıralarsak listemizdeki 0.,1.,2.,3.,4.,5. gibi sıralı elemanlar gösteriliyor. Ekranı yukarı kaydırıp bir sonraki elemanı görüntülemek istediğimizde Yeşil-Green satırı görüntüden kaybolacaktır. Ancak iki TextView içeren bu satırın Java temsili olan nesne silinmeyecektir.

Ekranda gösterilecek yeni satır pozisyonu 6 olacaktır. Yani yine listemizin 6 elemanı gösterilecektir. İşte bu aşamada artık gösterilmeyen satır en aşağıya alınmış olur. Artık bu satırın TextView’lerine listemizdeki 6. eleman(nesnenin) içindeki ‘’Mor’’ ve ‘’Purple’’ bilgileri yazılabilir.

Özetle bir geri dönüşüm işlemi yapmış olduk. Gösterilmeyen satırın içindeki görsellere, artık listede sonraki elemanın bilgileri yazılıyor.

Konumuza geri dönelim; getView() metodunda convertView bize (bir satır görselini, kalıbını temsil eden Java nesnesi) bir ‘’geri dönüşüm’’ nesnesi verir.

Ancak ekranda daha önce bir şey gösterilmemişse bu null olacaktır. (Ekranı doldurduktan sonra kaydırıldığında, gösterilmeyenler yeniden kullanılıyor.)

Bundan dolayı öncelikle convertView null ise: bir satırı temsil eden XML kalıbımızı bir Java nesnesi haline getiriyoruz. Bu kısmı da standart kabul edebiliriz. Yani convertView nesnei daha önce yoksa yeni bir tane oluşturmuş olduk.

Daha sonra convertView elde ettikten sonra örneğimizdeki satirkalibi.xml’i hatırlarsak, turkceRenkTV ve ingilizceRenkTV id’lerine sahip iki TextView vardı.

TextView’leri bu id’ler ile convertView içinden bularak Java’da tanıtıyoruz(13. ve 14. satır).

Listedeki sıradaki elemana (bu örnekte ArrayList Renk nesneleri saklıyordu) erişiyoruz(16. satır).

Sırada bu nesnenin içindeki bilgileri, uygun görsellere yerleştiriyoruz(18. ve 19. satır).

Son olarak ListView’de sıradaki (position) gösterilecek convertView’i döndürüyoruz(21.satır).

RenkAdaptor nesnesi oluşturup ListView’e atayabiliriz.

Son olarak MainActivity’de renkler butonuna dinleyici ataması yapıyoruz.

Renkler butonuna tıklanınca açılan Renkler aktivitesinin görünümü yukarıdaki gibi olacaktır.

NOT : Nesneye Yönelik Programlama dillerinde bir programcılık geleneği olarak sınıf isimleri çoğul ek almamaktadır. Örn: Renkler yerine Renk olmalıdır. Bu örnekte uygulamanın anlaşılabilirliği açısından isimlendirmeler bu şekilde yapılmıştır.

Bir cevap yazın

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