Mobil cihazlarda yapılan listelemeler bazı durumlarda çok uzun olabiliyor. Örneğin rehber bunlardan bir tanesi. Bu gibi durumlarda, uygulamanın kullanılabilirliğini arttırmak için filtreleme yardımımıza yetişiyor.
Custom ListView ya da hazır gelen ListView için yapacağımız filtreleme işleminin farkı yok. Aşağıdaki çözümü (uygun şekilde) iki tür ListView için de kullanmak mümkün.
Öncelikle filtreleme işlemi için bir ListView’a ve filtrelemeyi sağlayacak bir EditText’e ihtiyacımız var. Bu bileşenleri LinearLayout olarak oluşturduğumuz yeni bir .xml’e ekleyelim. Adı filterable_list.xml olan dosyanın son hali:
[code lang=”xml”]<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText android:id="@+id/filter"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="type to filter"
android:inputType="text"
android:maxLines="1"/>
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
/>
</LinearLayout>
[/code]
Filtre işlemlerini içeren Activity’nin ListActivty’den extend edilmesi gerekiyor. Temel olarak; TextWatcher aracılığıyla EditText’in değişimini takip ederek, Adapter üzerinden filtre işlemini ListView’a yansıtacağız.
Adına ListFilterActivity verdiğimiz sınıfın son hali aşağıdaki gibi olacak:
[code lang=”java”]public class ListFilterActivity extends ListActivity {
private EditText filterText = null;
ArrayAdapter<String> adapter = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filterable_listview);
filterText = (EditText) findViewById(R.id.search_box);
filterText.addTextChangedListener(filterTextWatcher);
this.adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myStrings);
setListAdapter(adapter);
}
private TextWatcher filterTextWatcher = new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before,
int count) {
adapter.getFilter().filter(s);
}
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
};
private String[] myStrings = { "Ankara", "Trabzon", "Manisa", "Denizli" };
}
[/code]İşlemler bu kadar.
Soru ve katkı için yorumları kullanabilirsiniz.
[…] Daha önce Custom ListView üzerindeki filtreleme işlemlerinden bahsetmiştim. […]
Bu normal ListView’ler üzerinde uygulanan filtering işlemi. Custom olması için Filterable’la gelen getFilter() fonksiyonunu yeniden yazman gerekli. Bu şekilde sadece string içeren listelerde işe yarar.
SetLiStAdapter methodunu nerede tanımladın ?
Bir şey yazmadan önce deneseniz en azından ?
Önceki yorumumda SetLiStAdapter metodunu MyListView.SetListAdapter şeklinde kullandığımda çalıştı.
Eksik bölüm olduğunu düşünmüştüm ama eski örneklerimi incelediğimde setlistadapter metodunun sizin yaptığınız şekildede çalıştığını farkettim.
Yazı için teşekkürler.