我的应用程序有一个自定义的ListView-Adapter,它可以将一个包含多个TextViews的listview_item扩展到一个ListView中。
我已经在布局中添加了一个SearchView,但我希望它能够搜索该ListView,并通过查看在SearchView中键入的数据是否与TextViews中来自listview_items的任何数据相同来对其进行过滤。
发布于 2015-08-25 04:27:19
覆盖acitivity类中的OnQueryTextListener,如下所示:
@Override
public boolean onQueryTextChange(String newText) {
mAdapter.getFilter().filter(newText);
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
mAdapter.getFilter().filter(query);
return true;
}在适配器内部,实现过滤器,如:
public Filter getFilter() {
if (mFliter == null)
mFliter = new CustomFilter();
return mFliter;
}
private class CustomFilter extends Filter {
// called when adpater filter method is called
@Override
protected FilterResults performFiltering(CharSequence constraint) {
constraint = constraint.toString().toLowerCase();
FilterResults result = new FilterResults();
if (constraint != null && constraint.toString().length() > 0) {
ArrayList<CustomObject> filt = new ArrayList<CustomObject>(); //filtered list
for (int i = 0; i < originalList.size(); i++) {
CustomObject m = originalList.get(i);
if (m.getName().toLowerCase().contains(constraint)) {
filt.add(m); //add only items which matches
}
}
result.count = filt.size();
result.values = filt;
} else { // return original list
synchronized (this) {
result.values = originalList;
result.count = originalList.size();
}
}
return result;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
if (results != null) {
setList((ArrayList<CustomObject>) results.values); // notify data set changed
} else {
setList((ArrayList<CarObject>) originalList);
}
}
}
public void setList(ArrayList<CarObject> data) {
mList = data; // set the adapter list to data
YourAdapter.this.notifyDataSetChanged(); // notify data set change
}https://stackoverflow.com/questions/32191000
复制相似问题