İlk olarak, hem EditText hem de ListView içeren bir XML düzeni oluşturmanız gerekir.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- Pretty hint text, and maxLines -->
<EditText android:id="@+building_list/search_box"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="type to filter"
android:inputType="text"
android:maxLines="1"/>
<!-- Set height to 0, and let the weight param expand it -->
<!-- Note the use of the default ID! This lets us use a
ListActivity still! -->
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
/>
</LinearLayout>
Bu, ListView'ın üstünde güzel bir EditText ile her şeyi düzgün bir şekilde düzenleyecektir. Ardından, normalde yaptığınız gibi bir ListActivity oluşturun, ancak son zamanlarda bildirilen mizanpajımızı kullanmamız setContentView()
için onCreate()
yönteme bir çağrı ekleyin . ListView
Özel olarak kimliğimizi hatırlayın android:id="@android:id/list"
. Bu, bildirilen düzenimizde ListActivity
hangisini ListView
kullanmak istediğimizi bilmenizi sağlar .
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filterable_listview);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
getStringArrayList());
}
Uygulamayı şimdi çalıştırdığınızda, ListView
yukarıdaki güzel bir kutu ile öncekinizi göstermelisiniz. Bu kutunun bir şey yapması için, girdiyi ondan almamız ve bu giriş filtresini liste haline getirmemiz gerekir. Birçok kişi bunu manuel olarak yapmaya çalışsa da, çoğu ListView
Adapter
sınıf Filter
filtrelemeyi otomatik olarak gerçekleştirmek için kullanılabilecek bir nesne ile birlikte gelir . Biz sadece boruya girdi ihtiyaç EditText
haline Filter
. Anlaşılan oldukça kolay. Hızlı bir test yapmak için bu satırı onCreate()
aramanıza ekleyin
adapter.getFilter().filter(s);
ListAdapter
Bu işi yapmak için bir değişkene kaydetmeniz gerekeceğine dikkat edin - ArrayAdapter<String>
daha önce 'adaptör' adı verilen bir değişkene kaydettim .
Bir sonraki adım, girdiyi EditText
. Bu aslında biraz düşünüyor. Bir ekleyebilir OnKeyListener()
adresinden Müşteri EditText
. Ancak, bu dinleyici yalnızca bazı önemli olayları alır . Örneğin, bir kullanıcı 'wyw' girerse, tahmini metin muhtemelen 'göz' önerecektir. Kullanıcı 'wyw' veya 'eye' seçimini yapana kadar OnKeyListener
önemli bir etkinlik almazsınız. Bazıları bu çözümü tercih edebilir, ancak sinir bozucu buldum. Her önemli olayı istedim, bu yüzden filtreleme ya da filtreleme seçeneğim yoktu. Çözüm bir TextWatcher
. Basitçe oluşturmak ve eklemek TextWatcher
için EditText
, ve geçiş ListAdapter
Filter
bir filtre isteği metin her değiştirdiğinde. Kaldırmayı unutmayın TextWatcher
in OnDestroy()
! İşte nihai çözüm:
private EditText filterText = null;
ArrayAdapter<String> adapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filterable_listview);
filterText = (EditText) findViewById(R.id.search_box);
filterText.addTextChangedListener(filterTextWatcher);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
getStringArrayList());
}
private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
adapter.getFilter().filter(s);
}
};
@Override
protected void onDestroy() {
super.onDestroy();
filterText.removeTextChangedListener(filterTextWatcher);
}