Pertama, Anda perlu membuat tata letak XML yang memiliki EditText, dan ListView.
<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>
Ini akan meletakkan semuanya dengan benar, dengan EditText yang bagus di atas ListView. Selanjutnya, buat ListActivity seperti biasa, tetapi tambahkan setContentView()
panggilan dalam onCreate()
metode ini sehingga kami menggunakan tata letak yang baru saja dinyatakan. Ingatlah bahwa kami telah mengidentifikasi ListView
secara khusus, dengan android:id="@android:id/list"
. Ini memungkinkan ListActivity
untuk mengetahui mana yang ListView
ingin kita gunakan dalam tata letak yang kita nyatakan.
@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());
}
Menjalankan aplikasi sekarang harus menunjukkan yang sebelumnya ListView
, dengan kotak yang bagus di atas. Untuk membuat kotak itu melakukan sesuatu, kita perlu mengambil input darinya, dan membuat input itu menyaring daftar. Sementara banyak orang telah mencoba melakukan ini secara manual, sebagian besar ListView
Adapter
kelas datang dengan Filter
objek yang dapat digunakan untuk melakukan penyaringan secara otomatis. Kami hanya perlu menyalurkan input dari EditText
ke Filter
. Ternyata itu cukup mudah. Untuk menjalankan tes cepat, tambahkan baris ini ke onCreate()
panggilan Anda
adapter.getFilter().filter(s);
Perhatikan bahwa Anda perlu menyimpan ListAdapter
variabel Anda untuk membuat ini berfungsi - saya telah menyimpan ArrayAdapter<String>
dari saya sebelumnya ke variabel yang disebut 'adaptor'.
Langkah selanjutnya adalah mendapatkan input dari EditText
. Ini sebenarnya butuh sedikit pemikiran. Anda dapat menambahkan OnKeyListener()
ke EditText
. Namun, pendengar ini hanya menerima beberapa peristiwa penting . Misalnya, jika pengguna memasukkan 'wyw', teks prediksi kemungkinan akan merekomendasikan 'mata'. Sampai pengguna memilih 'wyw' atau 'eye', Anda OnKeyListener
tidak akan menerima acara utama. Beberapa mungkin lebih suka solusi ini, tetapi saya merasa frustasi. Saya ingin setiap acara utama, jadi saya punya pilihan untuk memfilter atau tidak. Solusinya adalah a TextWatcher
. Cukup buat dan tambahkan TextWatcher
ke EditText
, dan teruskan ListAdapter
Filter
permintaan filter setiap kali teks berubah. Ingatlah untuk menghapus TextWatcher
in OnDestroy()
! Inilah solusi terakhir:
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);
}