简体   繁体   English

AutoCompleteTextView 自定义筛选结果被忽略

[英]AutoCompleteTextView custom filter results are ignored

I've created a custom adapter for AutoCompleteTextView.我为 AutoCompleteTextView 创建了一个自定义适配器。

package ...

import ...

public class CardSuggestionAdapter extends ArrayAdapter<String> implements Filterable {

    private final LayoutInflater mInflater;
    private Activity context;
    private int mFieldId, mResource;

    CardSuggestionAdapter(Activity context, String[] names) {
        super(context, R.layout.card_suggestion, R.id.name_label, names);
        this.context = context;
        this.mFieldId = R.id.name_label;
        this.mResource = R.layout.card_suggestion;
        this.mInflater = LayoutInflater.from(context);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        return createViewFromResource(mInflater, position, convertView, parent, mResource);
    }

    @NonNull
    @Override
    public Filter getFilter() {
        return new CardsFilter();
    }

    private View createViewFromResource(@NonNull LayoutInflater inflater, int position, @Nullable
            View convertView, @NonNull ViewGroup parent, int resource) {
        View view = convertView;
        final TextView text;

        ViewHolder viewHolder;
        if (convertView == null) {
            view = inflater.inflate(resource, parent, false);
            viewHolder = new ViewHolder(view);
            view.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }
        text = view.findViewById(mFieldId);
        if (text == null) {
            throw new RuntimeException("Failed to find view with ID "
                    + context.getResources().getResourceName(mFieldId)
                    + " in item layout");
        }

        final String item = getItem(position);
        viewHolder.name.setText(item);
        viewHolder.name.setTypeface(Typeface.createFromAsset(
                MarsPDA.assetManager, "fonts/prototype.ttf"));

        return view;
    }

    class ViewHolder {

        TextView name;

        ViewHolder(View v) {
            name = v.findViewById(R.id.name_label);
        }
    }

    private class CardsFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            if (constraint != null) {
                final List<String> suggestions = new ArrayList<>();
                final FilterResults fs = new FilterResults();
                return fs;
            } else {
                return new FilterResults();
            }
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            if (results != null && results.count > 0) {
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }
    }
}

This implementation of performFiltering obviously makes that no suggestion is displayed. performFiltering这种实现显然使得不显示任何建议。

I tried copying performFiltering method from original ArrayAdapter class as well as looking into some other implementations of Filter found on this forum, but even when I add actually literally anything to suggestions list and set fs.values = suggestions;我尝试从原始ArrayAdapter类中复制performFiltering方法,并查看在此论坛上找到的其他一些Filter实现,但即使我实际上将任何内容添加到suggestions列表并设置fs.values = suggestions; and fs.count = suggestions.size();fs.count = suggestions.size(); , the adapter shows all members of the names array passed into the constructor. ,适配器显示传递给构造函数的names数组的所有成员。 Why is that happening?为什么会这样?

I think the problem is in manging list, you can try below changes Declare both list original and filter and then initialise it in constructor.我认为问题出在管理列表中,您可以尝试以下更改声明原始列表和过滤器,然后在构造函数中对其进行初始化。

Override get count method.覆盖 get count 方法。

@Override
    public int getCount() {
        return names.size();
    }

Make changes in filter class as below:在过滤器类中进行如下更改:

private class CardsFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            FilterResults results = new FilterResults();        // Holds the results of a filtering operation in values
            List<String> FilteredArrList = new ArrayList<String>();
            if (constraint == null || constraint.length() == 0) {

                // set the Original result to return
                results.count = namesOriginal.size();
                results.values = namesOriginal;
            } else {
                constraint = constraint.toString().toLowerCase();
                for (int i = 0; i < namesOriginal.size(); i++) {
                    String data = namesOriginal.get(i);
                    if (data.toLowerCase().startsWith(constraint.toString())) {
                        FilteredArrList.add(data);
                    }
                }
                // set the Filtered result to return
                results.count = FilteredArrList.size();
                results.values = FilteredArrList;
            }
            return results;

        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            if (results != null && results.count > 0) {
                names= (ArrayList<String>) results.values;
                notifyDataSetChanged();
            } else {
                names.addAll(namesOriginal);
                notifyDataSetInvalidated();
            }
        }
    }

Hope this will help.希望这会有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM