Я использовал EditText
, чтобы сделать работу.
Сначала я создал две копии массива для хранения списка данных для поиска:
List<Map<String,String>> vehicleinfo;
List<Map<String,String>> vehicleinfodisplay;
Как только я получаю данные из своего списка, я копирую их:
for(Map<String,String>map : vehicleinfo)
{
vehicleinfodisplay.add(map);
}
и используйте SimpleAdapter
, чтобы отобразить (скопированную) версию моих данных:
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);
Затем я добавил TextWatcher
к EditText
, который отвечает на событие afterTextChanged
, очистив отображаемую версию списка и затем добавив обратно только элементы из другого списка, которые соответствуют критериям поиска (в case поле "reg" содержит строку поиска). Как только список отображения заполнен отфильтрованным списком, я просто вызываю notifyDataSetChanged
в списке SimpleAdapter
.
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 ...
});
Надеюсь, это кому-нибудь пригодится.