4 Mart 2015 Çarşamba

Adapter ile yapılan layoutlar

Layout içeriğini runtime sırasında viewlarla doldurabiliriz.
AdapterView ın subclassları bir Adapter objesiyle datayı layout a bağlar.
Adapter veriyi bir array yada veritabanı sorgusundan alır, buradaki her bir entry yi layouta eklenebilecek birer View e dönüştürür.

Adapter kullanan layoutlar ListView ve GridView dır.
Bunların kullandığı Adapter ler ArrayAdapter ve SimpleCursorAdapter dır.

Adapter ın okuduğu veri değiştiğinde bunu refresh etmesi için  "notifyDataSetChanged()" metodunu çağırmak gerekir.

AdapterView ın gösterdiği elemanlardan herhangi birine tıklandığı eventi yakalamak için AdapterView.OnItemClickListener interface ini implement ederiz. Örneğin:
// Create a message handling object as an anonymous class.
private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() {
    public void onItemClick(AdapterView parent, View v, int position, long id) {
        // Do something in response to the click
    }
};
listView.setOnItemClickListener(mMessageClickedHandler);

Kendi listemizi yapmak için önce bir item classı yazıp, sonra bu classin elemanlarını içeren bir arraylist i dolduruyoruz. Bunları da baseAdapter classdan extend ettiğimiz bir custom adapter e bagliyoruz.
BaseAdapter deki 4 metodu override etmek gerekiyor:

 getCount(): int değer döner. ListView'da gösterilecek satır sayısını ifade eder. Verilerimizi barındıran ArrayList'in boyutu (size()) burada bize yarayacak.
 getItem(int position): Object değer döner. position ile belirtilen satıra denk düşen nesneyi döndürür. Bu nesne satır olarak gösterilecek nesnedir. Bundan dolayı Object yerine doğrudan model sınıfınızdan oluştuğunuz nesneyi de dönüş türü olarak belirleyebilirsiniz.
 getItemId(int position): long değer döndürmelidir. Veri listesinde position ile sırası belirtilen satırın kimlik numarasını (id) döndürür. Liste içeriğini veri tabanına kaydedecekseniz ya da orada eşlemeler yapacaksanız önem kazanır.
 getView(int position, View convertView, ViewGroup parent): View değer döner. position ile sırası belirtilen satır için bir View döndürür. Bu metot içindeyken her satır için XMLi okuyup View haline getirme işlemi (inflating) yaparız. Bu hususta bize LayoutInflater servisi yardımcı olacaktır.


Örneğin:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

<ListView
    android:id="@+id/liste"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

</RelativeLayout>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <ImageView
       android:id="@+id/simge"
       android:layout_width="48dp"
       android:layout_height="48dp" />

    <TextView
       android:id="@+id/isimsoyisim"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content" />

</LinearLayout>

public class Kisi {
    private String  isim;
    private boolean kadinMi;

    public Kisi(String isim, boolean kadinMi) {
        super();
        this.isim = isim;
        this.kadinMi = kadinMi;
    }

    @Override
    public String toString() {
        return isim;
    }

    public String getIsim() {
        return isim;
    }

    public void setIsim(String isim) {
        this.isim = isim;
    }

    public boolean isKadinMi() {
        return kadinMi;
    }

    public void setKadinMi(boolean kadinMi) {
        this.kadinMi = kadinMi;
    }
}

public class MainActivity extends Activity {
    final List<Kisi> kisiler=new ArrayList<Kisi>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        kisiler.add(new Kisi("Ahmet Yılmaz", false));
        kisiler.add(new Kisi("Ayşe Küçük", true));
        kisiler.add(new Kisi("Fatma Bulgurcu", true));
        kisiler.add(new Kisi("İzzet Altınmeşe", false));
        kisiler.add(new Kisi("Melek Subaşı", true));
        kisiler.add(new Kisi("Selim Serdilli",false));
        kisiler.add(new Kisi("Halil İbrahim",false));
    }
}

public class OzelAdapter extends BaseAdapter {

    private LayoutInflater mInflater;
    private List<Kisi>     mKisiListesi;

    public OzelAdapter(Activity activity, List<Kisi> kisiler) {
        //XML'i alıp View'a çevirecek inflater'ı örnekleyelim
        mInflater = (LayoutInflater) activity.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        //gösterilecek listeyi de alalım
        mKisiListesi = kisiler;
    }

    @Override
    public int getCount() {
        return mKisiListesi.size();
    }

    @Override
    public Kisi getItem(int position) {
        //şöyle de olabilir: public Object getItem(int position)
        return mKisiListesi.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View satirView;

        satirView = mInflater.inflate(R.layout.satir_layout, null);
        TextView textView =
                (TextView) satirView.findViewById(R.id.isimsoyisim);
        ImageView imageView =
                (ImageView) satirView.findViewById(R.id.simge);

        Kisi kisi = mKisiListesi.get(position);

        textView.setText(kisi.getIsim());

        if (kisi.isKadinMi()) {
            imageView.setImageResource(R.drawable.kadin_simge);
        }
        else {
            imageView.setImageResource(R.drawable.adam_simge);
        }
        return satirView;
    }
}

Hiç yorum yok:

Yorum Gönder