Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

17 Temmuz 2011 Pazar

onListItemClick 'i anlamak

Ne zaman onListItemClick olayını(event) kullanmak zorunda kalırız:
Bir aktivite mizin içinde ListView ile elemanları sıralamak ve bu elemanların üstüne tıklandığında bir şey yapmak istediğimizde.

Bu duruma ulaşmak için gideceğimiz yolu hızlıca özetleyelim.
ListView içeren bir LAYOUTa sahip olalım ve içine sıralı elemanlar koyalım (yaygın örnek "ülkeler listesi"). Bu listedeki elemanları basit bir yapıda görüntülemek isteseydik android sisteminde tanımlı layout'lar mevcut:
android.R.layout.simple_list_item_1
android.R.layout.simple_dropdown_item_1line
android.R.layout.simple_expandable_list_item_2


Ama bizim oluşturduğumuz LAYOUTumuzda her satırda bir resim, iki metin kutusu gibi çeşitli bileşenler olsun. Bu bileşenlerin her biri ListView içinde her bir satırda olacaktır. Her satırda, bu bileşenleri yakalayıp değerleri bağlamak ya da bu satırlara tıklandığında(onListItemClick) çekmek istiyoruz. Çok vurguladım bu durumu ama yapıyı anlamak sorunları çözmenin en önemli kısmıdır. ListView > Bileşenler(TextView,ImageView,Button...)

Peki şimdi ListView'a verileri(Array şeklinde veri kümesi) bağlamak için bir adaptöre ihtiyacımız olacak. Bu adapter: ArrayAdapter tipinde(ya da tipinden TÜRETİLMİŞ kendi özelleştirdiğimiz adaptör) olacaktır.

ListActivity tipindeki sınıfımız ekranımızı oluşturacaktır ve adaptörümüzü setListAdapter(adaptörümüzden bir örnek(object-nesne)) metodu ile ekranımıza verileri bağlamış olacağız. Bu durumu önceki yazımda anlatmaya çalıştım.

ArrayAdapter sınıfından türettiğimiz özelleştirmiş olduğumuz Adapter sınıfı:

class OzellesmisAdapter extends ArrayAdapter{

public OzellesmisAdapter(Context context, int satirSablonununResourceId, Object[] veriler) {
super(context, satirSablonununResourceId, veriler);
}

@Override
public Object getItem(int position) {
// position : yapıcı metotta tanımlı veriler parametresinde aradığımız elemanın index
return super.getItem(position);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// position : Veri kümemizde x. satırımız
//
// convertView : Veri kümemizde position daki verilerimizi LAYOUT'a bağlayacağız.
// Ortaya vir View tipinde convertView parametresi çıkacak.
// Bu view eğer oluşturulmamışsa(null) ise LayoutInflater marifetiyle oluşturacağız
// LayoutInflater linf = (LayoutInflater) activityCtx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// convertView = convertView null ? linf.inflate(R.layout.template_row_tags, parent, false) : convertView;
// LayoutInflater gördüğünüz üzere android sisteminin parçası olan bir servis.
//
// parent : Bunu bende bilmiyorum bilen varsa yorum olarak yazsın lütfen.
return super.getView(position, convertView, parent);
}
}


ArrayAdapter'i bağlamış olalım ListActivity mize setListAdapter ile. Şimdi odak noktamıza dönersek, satırlarımız var ve üstüne tıklandığında, tıklanılan satırın bileşenlerindeki bilgileri(Text, Width, Padding v.s.) çekelim.

onListItemClick olayına(event) bakalım:

@Override
protected void onListItemClick(ListView parent, View satir, int position, long id) {



parent : The ListView where the click happened
satir : The view that was clicked within the ListView
position : The position of the view in the list
id : The row id of the item that was clicked

Birinci parametre ListView parent tüm satırları barındıran bileşenimiz. parent.getAdapter() dediğimizde yukarıda tanımlamış olduğumuz ArrayAdapter sınıfından türettiğimiz, verileri barındıran sınıfımızın örneğine ulaşmış oluruz. parent.getAdapter().getItem(1) dediğimizde ArrayAdapter tipinde verilerimizi ve bu verilerin ekrandaki satırlara bağlanmasını sağlayan sınıfımızın getItem metoduna (yukarıda gördüğünüz) 1 parametresi geçirdiğimizde, veri kümemizde(data set) 1'inci satır(index = 1) daki veriyi(item) dönecektir. getItem() bize ArrayAdapter sınıfımız eğer jenerik olsaydı class OzellesmisAdapter extends ArrayAdapter<KendiSinifimiz>{ o zaman getItem metodu bize KendiSinifimiz tipinde objemizi döndürecektir.

View satir parametresi ise tıkladığımız satırı döndürecektir. Bu satırdaki bileşenlere (TextView, ImageView, Button ...) satir.findViewById(R.id.tvBaslik) koduyla erişmemiz mümkün olacak.