Tôi đã sử dụng EditText
để thực hiện công việc.
Trước tiên tôi tạo ra hai bản sao của mảng để giữ danh sách các dữ liệu để tìm kiếm:
List<Map<String,String>> vehicleinfo;
List<Map<String,String>> vehicleinfodisplay;
Một khi tôi đã có dữ liệu danh sách của tôi từ nơi nào đó, tôi sao chép nó:
for(Map<String,String>map : vehicleinfo)
{
vehicleinfodisplay.add(map);
}
và sử dụng một số SimpleAdapter
để hiển thị phiên bản hiển thị (sao chép) của dữ liệu của tôi:
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);
Sau đó tôi đã thêm một TextWatcher
đến EditText
phản hồi sự kiện afterTextChanged
bằng cách xóa phiên bản hiển thị của danh sách và sau đó chỉ thêm lại các mục từ danh sách khác đáp ứng tiêu chí tìm kiếm (trong trường hợp này trường "reg" chứa chuỗi tìm kiếm). Khi danh sách hiển thị được điền với danh sách được lọc, tôi chỉ cần gọi notifyDataSetChanged
trên danh sách SimpleAdapter
của danh sách.
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 ...
});
Hy vọng điều này hữu ích cho người khác.
Một ví dụ rất tốt là tại http://www.androidpeople.com/android-listview-searchbox-sort-items – amithgc
Giải pháp này tạo ra một mảng dữ liệu mới và một ListAdapter mới cho mỗi ký tự được nhập. Tôi không thể tin rằng đây là cách tốt nhất để làm điều đó .. –