过滤复杂数据(对象和自定义布局)的SearchView

时间:2019-01-23 14:27:40

标签: android filter kotlin searchview

我的适配器扩展了我在互联网上找到的类 MatchableArrayAdapter

该类使我的列表视图具有复杂的布局(布局不仅是Textview,而且是多个布局和textViews)。

我有这个复杂的布局,因为我使用的对象内部有多个数据(因此我可以在同一项目上显示名称,ID ...)

所以我要从片段中将对象的数组列表传递给适配器。

我想要的是这

我想添加一个searchView ,它将对任何对象 properties (ID上的过滤器)进行过滤 ,名称,位置...)

任何想法该怎么做?我发现我需要使用 Filterable ,但我不明白为什么...

1 个答案:

答案 0 :(得分:0)

所以..使用EditText手动进行过滤会更容易。

但是!如果您仍然想使用过滤器和SearchView进行操作,则如下所示:

  1. 您需要扩展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的字段,您应该将其更改为要搜索的值。

  1. 您需要在适配器中覆盖方法getFilter:

    @Override
    public Filter getFilter(){
        return new MyFilter();
    }
    
  2. 设置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;
        }
    });
    

希望能帮助某人

欢呼