Di Android, bagaimana saya bisa ListView
memfilter berdasarkan input pengguna, di mana item yang ditampilkan diperbarui secara dinamis berdasarkan TextView
nilai?
Saya mencari sesuatu seperti ini:
-------------------------
| Text View |
-------------------------
| List item |
| List item |
| List item |
| List item |
| |
| |
| |
| |
-------------------------
Jawaban:
Pertama, Anda perlu membuat tata letak XML yang memiliki EditText, dan ListView.
Ini akan meletakkan semuanya dengan benar, dengan EditText yang bagus di atas ListView. Selanjutnya, buat ListActivity seperti biasa, tetapi tambahkan
setContentView()
panggilan dalamonCreate()
metode ini sehingga kami menggunakan tata letak yang baru saja dinyatakan. Ingatlah bahwa kami telah mengidentifikasiListView
secara khusus, denganandroid:id="@android:id/list"
. Ini memungkinkanListActivity
untuk mengetahui mana yangListView
ingin kita gunakan dalam tata letak yang kita nyatakan.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 besarListView
Adapter
kelas datang denganFilter
objek yang dapat digunakan untuk melakukan penyaringan secara otomatis. Kami hanya perlu menyalurkan input dariEditText
keFilter
. Ternyata itu cukup mudah. Untuk menjalankan tes cepat, tambahkan baris ini keonCreate()
panggilan AndaPerhatikan bahwa Anda perlu menyimpan
ListAdapter
variabel Anda untuk membuat ini berfungsi - saya telah menyimpanArrayAdapter<String>
dari saya sebelumnya ke variabel yang disebut 'adaptor'.Langkah selanjutnya adalah mendapatkan input dari
EditText
. Ini sebenarnya butuh sedikit pemikiran. Anda dapat menambahkanOnKeyListener()
keEditText
. 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', AndaOnKeyListener
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 aTextWatcher
. Cukup buat dan tambahkanTextWatcher
keEditText
, dan teruskanListAdapter
Filter
permintaan filter setiap kali teks berubah. Ingatlah untuk menghapusTextWatcher
inOnDestroy()
! Inilah solusi terakhir:sumber
menjalankan program akan menyebabkan kekuatan ditutup.
Saya menukar saluran:
dengan
mungkinkah itu masalahnya? Untuk apa '@ + building_list'?
sumber
saya punya masalah dengan pemfilteran, bahwa hasilnya telah disaring, tetapi tidak dikembalikan !
jadi sebelum pemfilteran (aktivitas dimulai) saya membuat daftar cadangan .. (hanya daftar lain, berisi data yang sama)
pada pemfilteran, filter dan listadapter terhubung ke daftar utama.
tetapi filter itu sendiri menggunakan data dari daftar cadangan.
ini memastikan dalam kasus saya, bahwa daftar tersebut segera diperbarui dan bahkan pada penghapusan istilah-pencarian-karakter, daftar akan berhasil dipulihkan dalam setiap kasus :)
terima kasih atas solusi ini.
sumber