我的适配器扩展了我在互联网上找到的类 MatchableArrayAdapter 。
该类使我的列表视图具有复杂的布局(布局不仅是Textview,而且是多个布局和textViews)。
我有这个复杂的布局,因为我使用的对象内部有多个数据(因此我可以在同一项目上显示名称,ID ...)
所以我要从片段中将对象的数组列表传递给适配器。
我想要的是这
我想添加一个searchView ,它将对任何对象 properties (ID上的过滤器)进行过滤 ,名称,位置...)
任何想法该怎么做?我发现我需要使用 Filterable ,但我不明白为什么...
答案 0 :(得分:0)
所以..使用EditText手动进行过滤会更容易。
但是!如果您仍然想使用过滤器和SearchView进行操作,则如下所示:
您需要扩展Filter类,如下所示:
private class MyFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
final FilterResults results = new FilterResults();
if (constraint == null || constraint.length() == 0) {
final ArrayList<MyObject> list;
synchronized (adapter) {
list = new ArrayList<>(allObjects);
}
results.values = list;
results.count = list.size();
} else {
final String prefixString = constraint.toString().toLowerCase();
final ArrayList<MyObject> values;
synchronized (adapter) {
values = new ArrayList<>(allObjects);
}
final int count = values.size();
final ArrayList<MyObject> newValues = new ArrayList<>();
for (int i = 0; i < count; i++) {
final MyObject value = values.get(i);
final String valueText = value.firstName.toLowerCase() + " " + value.lastName.toLowerCase();
Log.i("search", valueText);
if (valueText.contains(prefixString)) {
newValues.add(value);
Log.i("search", "in");
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
adapter.students = (List<MyObject>) results.values;
if (results.count > 0) {
adapter.notifyDataSetChanged();
} else {
adapter.notifyDataSetInvalidated();
}
}
}
请注意,我将“姓氏”和“姓氏”用作MyObject的字段,您应该将其更改为要搜索的值。
您需要在适配器中覆盖方法getFilter:
@Override
public Filter getFilter(){
return new MyFilter();
}
设置searchView查询监听器:
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
adapter.getFilter().filter(query);
return false;
}
@Override
public boolean onQueryTextChange(String query) {
adapter.getFilter().filter(query);
return false;
}
});
希望能帮助某人
欢呼