代码之家  ›  专栏  ›  技术社区  ›  VSB

为什么filter.publishResults()不在适配器中触发?

  •  0
  • VSB  · 技术社区  · 6 年前

    我现在要实现一个自定义数组适配器 SearchView 在我的申请表里。 我将从远程服务器返回自动完成建议,因此我尝试实现我的自定义筛选器。

    问题在我的自定义筛选器中 performFiltering 不过是被叫来的 publishResults 不调用任何数组适配器项的列表,而不应用任何筛选。

    我的代码如下,如果它工作正常,它必须显示3个固定项目后,过滤 TTT , XYZ , 测试 但正如我所解释的,它不会发生,项是数组元素,没有任何更改和过滤。

    搜索阵列适配器

    class SearchArrayAdapter extends ArrayAdapter<String> implements Filterable {
    
    
        public SearchArrayAdapter(@NonNull Context context, int resource) {
            super(context, resource);
        }
    
        public SearchArrayAdapter(@NonNull Context context, int resource, int textViewResourceId) {
            super(context, resource, textViewResourceId);
        }
    
        public SearchArrayAdapter(@NonNull Context context, int resource, @NonNull String[] objects) {
            super(context, resource, objects);
        }
    
        public SearchArrayAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull String[] objects) {
            super(context, resource, textViewResourceId, objects);
        }
    
        public SearchArrayAdapter(@NonNull Context context, int resource, @NonNull List<String> objects) {
            super(context, resource, objects);
        }
    
        public SearchArrayAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull List<String> objects) {
            super(context, resource, textViewResourceId, objects);
        }
    
        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
            View view = super.getView(position, convertView, parent);
            Log.v("MY_TAG", "Adapter Item:" + getItem(position));
            view.setTag(getItem(position));
            return view;
        }
    
        @NonNull
        @Override
        public Filter getFilter() {
            Filter myFilter = new Filter() {
    
                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
                    FilterResults filterResults = new FilterResults();
                    ArrayList<String> x = new ArrayList<>();
                    String[] arrayofString = (new String[]{"ttt", "xyz", "test"});
                    Collections.addAll(x, arrayofString);
                    filterResults.values = x;
                    filterResults.count = 3;
                    return filterResults;
                }
    
                @Override
                protected void publishResults(CharSequence constraint, FilterResults results) {
                    if (results != null && results.count > 0) {
                        notifyDataSetChanged();
                    } else {
                        notifyDataSetInvalidated();
                    }
                }
            };
            return myFilter;
        }
    }
    

    在我的碎片里:

    SearchArrayAdapter adapter = new SearchArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, searchItems);
    mSearchAutoComplete.setAdapter(adapter);
    mSearchAutoComplete.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.v("MY_TAG", "Adapter Position: " + position);
            Log.v("MY_TAG", "Adapter String: " + searchItems[position]);
            Log.v("MY_TAG", "Adapter TAG: " + view.getTag());
    
            searchView.setQuery((String) view.getTag(), true);
    
    
        }
    });
    searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener() {
        @Override
        public boolean onSuggestionSelect(int position) {
            Log.v("MY_TAG", "Item Selected: " + position);
            return true;
        }
    
    0 回复  |  直到 6 年前