31 Mayıs 2011 Salı

Android Serisi 5. Bölüm - List Activity - Custom Adapter

Merhaba,

Kaldığımız yerden list activity ile devam ediyoruz. Her zaman olduğu gibi yine lafı hiç uzatmayacağım, örnek bir senaryo ile konuya bodozlama giriş yapıyoruz. İşte senaryo; kullanıcının karşısına Türk futbol takımlarının olduğu bir liste sunacağız, kullanıcı listedeki itemlardan birine bastığında seçimini ekrana yansıtacağız, eğer bu itemlardan birine uzunca basarsa silmek isteyip istemediğini soracak ve ona göre aksiyon alacağız. Kısaca bugüne kadar öğrendiklerimizi hafifçe bir toparlamış olacağız. Hadi başlayalım.

Önce yeni bir proje ve takimlar isimli yeni bir aktivite yaratıyoruz yalnız bu aktivitenin öncekilerden bir farkı olacak. Bu aktivitemiz öncekiler gibi Activity class'ından değil ListActivity class'ından extend edilecek.

Daha sonra custom adapter'ımızı oluşturmak için layout > row.xml'imizi yaratıp aşağıdaki gibi düzenliyoruz.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip">
<ImageView
android:id="@+id/imgLogo"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginRight="6dip"
android:src="@drawable/icon" />
<LinearLayout
android:orientation="vertical"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="fill_parent">
<TextView
android:id="@+id/lblIsim"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:gravity="center_vertical"
/>
<TextView
android:id="@+id/lblSampiyonlukSayisi"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:singleLine="true"
android:ellipsize="marquee"
/>
</LinearLayout>
</LinearLayout>

Bu işlemin ardından drawable klasörlerimize 32x32 takım logolarımızı atıyoruz.



Tamam sıra geldi Takım classımızı oluşturmaya, resimdeki gibi src klasörünün altında Takim adinda bir class yaratıyor ve aşağıdaki gibi kodluyoruz.



package com.tft;

public class Takim {

//constructorlar
public Takim(){}
public Takim(String isim, int sampiyonluk_sayisi,String logo){
this._isim = isim;
this._sampiyonlukSayisi = sampiyonluk_sayisi;
this._logo = logo;
}

//fieldlar
private String _isim;
private int _sampiyonlukSayisi;
private String _logo;

//propertyler
public String getIsim(){
return _isim;
}
public void setIsim(String isim){
_isim = isim;
}

public int getSampiyonlukSayisi(){
return _sampiyonlukSayisi;
}
public void setSampiyonlukSayisi(int sampiyonlukSayisi){
_sampiyonlukSayisi = sampiyonlukSayisi;
}

public String getLogo(){
return _logo;
}
public void setLogo(String logo){
_logo = logo;
}
}

Şimdi de sıra customadapter'ımızda, yine src klasöründe TakimAdapter adinda bir class oluşturup aşağıdaki gibi düzenliyoruz.

package com.tft;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

class TakimAdapter extends ArrayAdapter<Takim> {
private Context context = null;
private ArrayList<Takim> items;

public TakimAdapter(Context context, int textViewResourceId, ArrayList<Takim> items) {
super(context, textViewResourceId, items);
this.items = items;
this.context = context;
}

public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
//inflaterlar xml inputu codebehind'da nesneye çevirmemizi sağlarlar.
LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(com.tft.R.layout.row, null);
}
Takim takim = items.get(position);
if (takim != null) {
//listemizde gözükecek kontrollerimizi set ediyoruz.
TextView lblIsim = (TextView) v.findViewById(com.tft.R.id.lblIsim);
TextView lblSampiyonlukSayisi = (TextView) v.findViewById(com.tft.R.id.lblSampiyonlukSayisi);
ImageView imgLogo = (ImageView)v.findViewById(com.tft.R.id.imgLogo);
if (lblIsim != null) {
lblIsim.setText(takim.getIsim()); }
if(lblSampiyonlukSayisi != null){
lblSampiyonlukSayisi.setText("Şampiyonluk Sayısı: "+ takim.getSampiyonlukSayisi());
}
if(imgLogo != null){
//logolarımızın IDlerini alıyoruz.
int logoID = context.getResources().getIdentifier(takim.getLogo(), "drawable", context.getPackageName());
imgLogo.setImageResource(logoID);
}
}
return v;
}
}


Artık custom adapterımızda, Takim class'imizda hazır. Takimlar ListActivity'mizi yapılandırabiliriz.

package com.tft;

import java.util.ArrayList;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;

public class Takimlar extends ListActivity { //ListActivity classından türetildi

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//takimlari kendi yarattığım row bazında oluşturuyorum
final ArrayAdapter<Takim> adapter = new TakimAdapter(this, com.tft.R.layout.row, getTakimlar());
setListAdapter(adapter);

//itemlara tıklandığında yapılacak işlem
getListView().setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> parent, View v, int position,
long arg3) {
Takim oTakim = (Takim)parent.getItemAtPosition(position);
Toast.makeText(getBaseContext(),
oTakim.getIsim(),
Toast.LENGTH_SHORT).show();
}
});

//itemlara uzun basıldığında yapılacak işlem
getListView().setOnItemLongClickListener(new OnItemLongClickListener(){
public boolean onItemLongClick(AdapterView<?> parent, View v,
int position, long arg3) {
final Takim oTakim = (Takim)parent.getItemAtPosition(position);
//burada AlertDialog.Builder'ın constructor'ına dikkat edin. Listactivitymizin context'ini atıyoruz.
AlertDialog.Builder builder = new AlertDialog.Builder(Takimlar.this);
builder.setMessage("Bu takımı silmek istediğinizden emin misiniz?");
builder.setPositiveButton("Evet", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
adapter.remove(oTakim);
adapter.notifyDataSetChanged();
}
});
builder.show();
return false;
}

});
}

//Takimlar ekleniyor
private ArrayList<Takim> getTakimlar(){
ArrayList<Takim> takimList = new ArrayList<Takim>();
takimList.add(new Takim("Galatasaray",17,"gs"));
takimList.add(new Takim("Fenerbahçe",18,"fb"));
takimList.add(new Takim("Beşiktaş",13,"bjk"));
takimList.add(new Takim("Trabzonspor",6,"ts"));
takimList.add(new Takim("Bursaspor",1,"bs"));
return takimList;
}

}

Çalıştırdığımızda projemizin ekran görüntüleri aşağıdaki gibi olmalı.





Bir sonraki örnek uygulamamızda görüşmek üzere derken tekrar hatırlatmak istiyorum sorularınızı çekinmeden sorabilirsiniz, fırsat bulduğum müddetçe yanıtlamaya çalışacağım.

Dosya İsmi: ListActivityOrnek.rar
Dosya Boyutu:74.59 KB

1 yorum:

  1. hocam eline sağlık yanlız yazılarında code format kullanırsan 10 numara olur yazıların devamını bekliyorum

    YanıtlaSil