He utilizado un EditText
para hacer el trabajo.
Primero crearon dos copias del vector que mantiene la lista de datos que desea buscar:
List<Map<String,String>> vehicleinfo;
List<Map<String,String>> vehicleinfodisplay;
Una vez que tengo los datos de la lista de alguna parte, lo copio:
for(Map<String,String>map : vehicleinfo)
{
vehicleinfodisplay.add(map);
}
y utilizar un SimpleAdapter
para mostrar la versión de pantalla (copiado) de mis datos:
String[] from={"vehicle","dateon","dateoff","reg"};
int[] to={R.id.vehicle,R.id.vehicledateon,R.id.vehicledateoff,R.id.vehiclereg};
listadapter=new SimpleAdapter(c,vehicleinfodisplay,R.layout.vehiclelistrow,from,to);
vehiclelist.setAdapter(listadapter);
Luego añade un TextWatcher
a la EditText
que responde a un evento afterTextChanged
en la limpieza de la versión de visualización de la lista y luego volviendo a añadir sólo los elementos de la otra lista que cumplen con los criterios de búsqueda (en este caso el campo "reg" contiene la cadena de búsqueda). Una vez que la lista de visualización se rellena con la lista filtrada, simplemente llamo al notifyDataSetChanged
en el SimpleAdapter
de la lista.
searchbox.addTextChangedListener(new TextWatcher()
{
@Override
public void afterTextChanged(Editable s)
{
vehicleinfodisplay.clear();
String search=s.toString();
for(Map<String,String>map : vehicleinfo)
{
if(map.get("reg").toLowerCase().contains(search.toLowerCase()))
vehicleinfodisplay.add(map);
listadapter.notifyDataSetChanged();
}
};
... other overridden methods can go here ...
});
Espero que esto sea útil para alguien.
Un muy buen ejemplo es en http://www.androidpeople.com/android-listview-searchbox-sort-items – amithgc
Esta solución crea una nueva matriz de datos y una nueva ListAdapter para cada personaje escrito. No puedo creer que esta sea la mejor manera de hacerlo ... –