En Android, ¿cómo puedo ListView
usar un filtro basado en la entrada del usuario, donde los elementos que se muestran se actualizan dinámicamente en función del TextView
valor?
Estoy buscando algo como esto:
-------------------------
| Text View |
-------------------------
| List item |
| List item |
| List item |
| List item |
| |
| |
| |
| |
-------------------------
Respuestas:
Primero, debe crear un diseño XML que tenga un EditText y un ListView.
Esto mostrará todo correctamente, con un agradable EditText encima de ListView. A continuación, cree una ListActivity como lo haría normalmente, pero agregue una
setContentView()
llamada en elonCreate()
método para que usemos nuestro diseño recientemente declarado. Recuerde que identificamos elListView
especialmente, conandroid:id="@android:id/list"
. Esto permiteListActivity
saber quéListView
queremos usar en nuestro diseño declarado.Ejecutar la aplicación ahora debería mostrar tu anterior
ListView
, con un bonito cuadro arriba. Para hacer que esa caja haga algo, necesitamos tomar la entrada de ella y hacer que esa entrada filtre la lista. Si bien muchas personas han intentado hacer esto manualmente, la mayoría de lasListView
Adapter
clases vienen con unFilter
objeto que se puede usar para realizar el filtrado de forma automática. Solo necesitamos canalizar la entrada desdeEditText
elFilter
. Resulta que es bastante fácil. Para ejecutar una prueba rápida, agregue esta línea a suonCreate()
llamadaTenga en cuenta que tendrá que guardarlo
ListAdapter
en una variable para que esto funcione: he guardado miArrayAdapter<String>
de antes en una variable llamada 'adaptador'.El siguiente paso es obtener la entrada de
EditText
. Esto realmente requiere un poco de reflexión. Podrías agregar unOnKeyListener()
a tuEditText
. Sin embargo, este oyente solo recibe algunos eventos clave . Por ejemplo, si un usuario ingresa 'wyw', el texto predictivo probablemente recomendará 'eye'. Hasta que el usuario elija 'wyw' u 'eye',OnKeyListener
no recibirá un evento clave. Algunos pueden preferir esta solución, pero me pareció frustrante. Quería cada evento clave, así que tuve la opción de filtrar o no filtrar. La solución es aTextWatcher
. Simplemente cree y agregue unTextWatcher
aEditText
, y paseListAdapter
Filter
una solicitud de filtro cada vez que cambie el texto. Recuerde que debe retirar elTextWatcher
deOnDestroy()
! Aquí está la solución final:fuente
ejecutar el programa provocará un cierre forzado.
Cambié la línea:
con
¿Podría ser el problema? ¿Para qué sirve la '@ + building_list'?
fuente
Tuve un problema con el filtrado, los resultados se han filtrado, ¡pero no se han restaurado !
así que antes de filtrar (inicio de actividad) creé una copia de seguridad de la lista ... (solo otra lista, que contiene los mismos datos)
Al filtrar, el filtro y el adaptador de lista se conectan a la lista primaria.
pero el filtro en sí utilizó los datos de la lista de respaldo.
esto aseguró en mi caso, que la lista se actualizó de inmediato e incluso al eliminar los caracteres de término de búsqueda, la lista se restaura con éxito en todos los casos :)
Gracias por esta solución de todos modos.
fuente