AutoCompleteTextView始终显示完整列表而不是过滤

时间:2013-07-14 07:37:26

标签: android

我想过滤autocompletetextview中的文字。当我开始输入文本而不是显示过滤的文本时,它显示完整的文本列表。我的意思是它不会过滤列表。

请帮我解决这个问题。我试过但无法识别问题

public class AutoCompleteAdapter extends ArrayAdapter<String> implements Filterable {
    private ArrayList<String> mData;

    public AutoCompleteAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
        mData = new ArrayList<String>();
        mData.add("one");
        mData.add("oneee");
        mData.add("two");
    }

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

    @Override
    public String getItem(int index) {
        return mData.get(index);
    }

    @Override
    public Filter getFilter() {
        Filter myFilter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                List<String> resultsSuggestions = new ArrayList<String>();
                if(constraint != null) {
                    for (int i = 0; i < getCount(); i++) {
                        if(getItem(i).toString().startsWith(constraint.toString())){
                            resultsSuggestions.add(getItem(i).toString());
                        }
                    }
                }
                FilterResults results = new FilterResults();
                results.values = resultsSuggestions;
                results.count = resultsSuggestions.size();
                return results;
            }

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence contraint, FilterResults results) {
                try {
                    ArrayList<String> newValues = (ArrayList<String>) results.values;
                    for (int i = 0; i < newValues.size(); i++) {
                        add(newValues.get(i));
                    }

                    if(results != null && results.count > 0) {
                        notifyDataSetChanged();
                    }
                    else {
                        notifyDataSetInvalidated();
                    }
                } catch(Exception e) {
                    Log.v("Near ATM", "Exception ::" + e.getMessage());
                }
            }
        };
        return myFilter;
    }
}

1 个答案:

答案 0 :(得分:0)

我会说你的问题出在publishResults方法中。即使notifyDataSetChanged(),您也应该致电result.count == 0。您的getItemgetCount方法应与过滤列表配合使用。所以你的代码应该是这样的:

public class AutoCompleteAdapter extends ArrayAdapter<String> implements Filterable {
private ArrayList<String> fullList;
private ArrayList<String> filtredList;

public AutoCompleteAdapter(Context context, int textViewResourceId) {
    super(context, textViewResourceId);
    filtredList = new ArrayList<String>();
    fullList = new ArrayList<String>();
    fullList.add("one");
    fullList.add("oneee");
    fullList.add("two");
}

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

@Override
public String getItem(int index) {
    return filtredList.get(index);
}

@Override
public Filter getFilter() {
    Filter myFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<String> resultsSuggestions = new ArrayList<String>();
            if(constraint != null) {
                for (int i = 0; i < fullList.size(); i++) {
                    if(fullList.get(i).startsWith(constraint.toString())){
                        resultsSuggestions.add(fullList.get(i));
                    }
                }
            }
            FilterResults results = new FilterResults();
            results.values = resultsSuggestions;
            results.count = resultsSuggestions.size();
            filtredList = resultsSuggestions;
            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence contraint, FilterResults results) {
            try {
                ArrayList<String> newValues = (ArrayList<String>) results.values;
                for (int i = 0; i < newValues.size(); i++) {
                    add(newValues.get(i));
                }

                if(results != null) {
                    notifyDataSetChanged();
                }
                else {
                    notifyDataSetInvalidated();
                }
            } catch(Exception e) {
                Log.v("Near ATM", "Exception ::" + e.getMessage());
            }
        }
    };
    return myFilter;
}

}