studio - Cómo actualizar dinámicamente un ListView en Android
reload listview android studio (3)
En Android, ¿cómo puedo ver un ListView
que se basa en la entrada del usuario, donde los elementos que se muestran 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 encima de ListView. A continuación, cree una ListActivity como lo haría normalmente, pero agregue una llamada onCreate()
método onCreate()
para que usemos nuestro diseño recientemente declarado. Recuerda que identificamos el ListView
especialmente, con android:id="@android:id/list"
. Esto permite que ListActivity
sepa qué ListView
queremos usar 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 debería mostrar su ListView
anterior, con un bonito recuadro arriba. Para hacer que esa caja haga algo, necesitamos tomar la información de entrada y hacer que esa entrada filtre la lista. Si bien muchas personas han intentado hacerlo manualmente, la mayoría de las clases del Adapter
ListView
vienen con un objeto Filter
que se puede usar para realizar el filtrado automágicamente. Solo necesitamos EditText
la entrada de EditText
al 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 deberá guardar su ListAdapter
en una variable para que esto funcione; he guardado mi ArrayAdapter<String>
de antes en una variable llamada ''adaptador''.
El siguiente paso es obtener la información de EditText
. Esto realmente toma un poco de pensamiento. Puede agregar OnKeyListener()
a su EditText
. Sin embargo, este oyente solo recibe algunos eventos clave . Por ejemplo, si un usuario ingresa ''wyw'', el texto predictivo probablemente recomendará ''ojo''. Hasta que el usuario elija ''wyw'' u ''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
a EditText
, y pase el Filter
ListAdapter
una solicitud de filtro cada vez que cambie el texto. Recuerde eliminar 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á una fuerza cercana.
Yo cambié la línea:
android: id = "@ + building_list / search_box"
con
android: id = "@ + id / search_box"
¿Podría ser el problema? ¿Para qué sirve la "@ + building_list"?
tuve un problema con el filtrado, ¡los resultados se filtraron, pero no se restauraron !
entonces antes de filtrar (inicio de actividad) creé una lista de respaldo ... (solo otra lista, que contiene los mismos datos)
en el filtrado, el filtro y el adaptador de lista están conectados a la lista principal.
pero el filtro usó los datos de la lista backuped.
esto garantizó en mi caso, que la lista se actualizó de inmediato e incluso al eliminar los caracteres de búsqueda-término, la lista se restablece con éxito en todos los casos :)
gracias por esta solución de todos modos.