Do wykonania pracy użyłem EditText
.
Najpierw stworzył dwie kopie tablicy do przechowywania listy danych do wyszukiwania:
List<Map<String,String>> vehicleinfo;
List<Map<String,String>> vehicleinfodisplay;
Raz mam moja lista danych skądś skopiować go:
for(Map<String,String>map : vehicleinfo)
{
vehicleinfodisplay.add(map);
}
i użyć SimpleAdapter
aby wyświetlić menu (skopiowany) wersję moich danych:
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);
Potem dodał TextWatcher
do EditText
, który odpowiada na zdarzenie afterTextChanged
przez wyczyszczenie wyświetlanej wersji listy, a następnie dodanie z powrotem tylko elementów z innej listy, które spełniają kryteria wyszukiwania (w tym przypadku pole "reg" zawiera ciąg wyszukiwania). Po zapełnieniu listy wyświetlania przefiltrowaną listą, po prostu zadzwonię pod numer notifyDataSetChanged
na listę SimpleAdapter
z listy.
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 ...
});
Mam nadzieję, że jest to pomocne dla kogoś.
Bardzo dobrym przykładem jest http://www.androidpeople.com/android-listview-searchbox-sort-items – amithgc
To rozwiązanie tworzy nową tablicę danych i nowy ListAdapter dla każdego wpisanego znaku. Nie mogę uwierzyć, że to jest najlepszy sposób, aby to zrobić .. –