【问题标题】:SearchView that filters complex data (object and custom layout)SearchView 过滤复杂数据(对象和自定义布局)
【发布时间】:2019-01-23 14:27:40
【问题描述】:

我的适配器扩展了我在 Internet 上找到的一个类 MatchableArrayAdapter

该类允许我为列表视图设置复杂的布局(布局不仅是 Textview,还包括多个布局和 textView)。

我有这个复杂的布局,因为我正在使用其中包含多个数据的对象(所以我可以在同一个项目上显示一个名称、一个 ID...)

所以我将 ArrayList of object 从我的片段传递给我的适配器。

我想要的是这个:

我想添加一个搜索视图,它将过滤 任何对象 属性(过滤ID , 名字, 位置...)

知道怎么做吗?我发现我需要使用 Filterable 但我不明白为什么...

【问题讨论】:

标签: android filter kotlin searchview


【解决方案1】:

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

但是!如果你还想用 Filter 和 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();
            }
        }
    }
    

请注意,我使用 firstname 和 lastname 作为 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;
        }
    });
    

希望对某人有所帮助,

干杯

【讨论】:

    猜你喜欢
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    相关资源
    最近更新 更多