Cómo actualizar dinámicamente un ListView en Android

En Android, ¿cómo puedo un ListView que filtra basado en la entrada del usuario, donde los elementos mostrados se actualizan dinámicamente en TextView valor de TextView ?

Estoy buscando algo como esto:

 ------------------------- | Text View | ------------------------- | List item | | List item | | List item | | List item | | | | | | | | | ------------------------- 

En primer lugar, debe crear un diseño XML que tenga un EditText y un 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> 

Esto establecerá todo correctamente, con un bonito EditText por encima de ListView. A continuación, cree una ListActivity como lo haría normalmente, pero agregue una llamada a onCreate() método onCreate() para que usemos nuestro diseño declarado recientemente. Recuerde que ID'ed el ListView especialmente, con android:id="@android:id/list" . Esto permite a ListActivity saber qué ListView queremos utilizar en nuestro diseño declarado.

  @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()); } 

Ejecutar la aplicación ahora debe mostrar su anterior ListView , con una bonita caja de arriba. Para que esa caja haga algo, necesitamos tomar la entrada de ella, y hacer que el filtro de entrada de la lista. Aunque muchas personas han intentado hacerlo manualmente, la mayoría de las clases del Adapter ListView vienen con un objeto Filter que se puede utilizar para realizar el filtrado de forma automática. Sólo tenemos que canalizar la entrada de la EditText en el Filter . Resulta que es bastante fácil. Para ejecutar una prueba rápida, agregue esta línea a su llamada onCreate()

 adapter.getFilter().filter(s); 

Tenga en cuenta que necesitará guardar su ListAdapter en una variable para que esto funcione. He guardado mi ArrayAdapter<String> desde anterior en una variable llamada 'adapter'.

El siguiente paso es obtener la entrada del EditText . Esto realmente toma un poco de pensamiento. Usted podría agregar un OnKeyListener() a su EditText . Sin embargo, este oyente sólo recibe algunos eventos clave . Por ejemplo, si un usuario introduce 'wyw', el texto predictivo probablemente recomendará 'eye'. Hasta que el usuario elija 'wyw' o 'ojo', su 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 un TextWatcher . Simplemente cree y agregue un TextWatcher al EditText y pase el ListAdapter Filter una solicitud de filtro cada vez que cambie el texto. Recuerde quitar el TextWatcher en OnDestroy() ! Aquí está la solución final:

 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); } 

Ejecutar el programa causará un cierre de la fuerza.

Yo engañé la línea:

Android: id = "@ + building_list / search_box"

con

Android: id = "@ + id / search_box"

¿Podría ser el problema? ¿Para qué sirve el '@ + building_list'?

Tuve un problema con el filtrado, que los resultados han sido filtrados, pero no restaurado !

Así que antes de filtrar (inicio de actividad) he creado una copia de seguridad de lista .. (sólo otra lista, que contiene los mismos datos)

En el filtrado, el filtro y el listadapter se conectan a la lista primaria.

Pero el propio filtro usó los datos de la lista respaldada.

Esto aseguró en mi caso, que la lista se actualizó inmediatamente e incluso en la eliminación de los términos de búsqueda de caracteres de la lista se restaura con éxito en todos los casos 🙂

Gracias por esta solución de todos modos.

  • Android ListView múltiples matrices con adaptador personalizado
  • Cómo utilizar notifyDataSetChanged () en el subproceso
  • Más de 1 Urls diferentes y sólo One listview
  • NotifyDataSetChanged () en Fragmento no está actualizando listview
  • Android set listview height dinámicamente
  • Diferente posición z para los elementos ListView
  • ¿Cómo puedo usar layout_weight en RecyclerView o Vista de elemento ListView para que los elementos de igual altura llenen el espacio disponible en la pantalla?
  • ListView getChildAt devolver null para los niños visibles
  • El adaptador personalizado de Android no funciona correctamente para la lista de chat
  • Cambio de fondo del elemento de vista de lista de Android
  • ¿Cómo establecer alturas diferentes para cada fila en un ListView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.