AutoCompleteTextView - 禁用过滤

Posted

技术标签:

【中文标题】AutoCompleteTextView - 禁用过滤【英文标题】:AutoCompleteTextView - disable filtering 【发布时间】:2012-01-20 17:11:34 【问题描述】:

我正在从 webservice 检索字符串列表,并且我想将它们列在 AutoCompleteTextField 上,而不管内置的 AutoCompleteTextField 过滤器如何。

我该怎么做?有没有办法轻松禁用它的内部过滤(最好没有子类化) 我已将所有结果加载到ArrayAdapter,问题是其中一些由于过滤而没有显示。

如果我走错了方向,请指出正确的方向。

【问题讨论】:

失去了半天。谢谢兄弟:) 【参考方案1】:

可能@Alon 意味着继承ArrayAdapter,而不是AutoCompleteTextView。在getFilter() 方法中,必须返回一个自定义过滤器,它根本不执行任何过滤(在其performFiltering() 中)。可能性能可能是一个问题 - 因为产生了读取。最好的办法是从 TextEdit 派生并实现自己的完成弹出窗口。但这对我来说又是太多麻烦了,到目前为止。最后,我做了以下事情,它对我有用。任何反馈表示赞赏。

public class KArrayAdapter<T> 
extends ArrayAdapter<T>

    private Filter filter = new KNoFilter();
    public List<T> items;

    @Override
    public Filter getFilter() 
        return filter;
    

    public KArrayAdapter(Context context, int textViewResourceId,
            List<T> objects) 
        super(context, textViewResourceId, objects);
        Log.v("Krzys", "Adapter created " + filter);
        items = objects;
    

    private class KNoFilter extends Filter 

        @Override
        protected FilterResults performFiltering(CharSequence arg0) 
            FilterResults result = new FilterResults();
                result.values = items;
                result.count = items.size(); 
            return result;
        

        @Override
        protected void publishResults(CharSequence arg0, FilterResults arg1) 
            notifyDataSetChanged();
        
    

希望对您有所帮助。

【讨论】:

【参考方案2】:

将文本设置为 AutoCompleteTextView 时,请使用 setText(CharSequence text, boolean filter)。 将过滤器设置为false,这会设置文本而不激活过滤器

【讨论】:

这是急需的答案!【参考方案3】:

我通过制作一个扩展ArrayAdapter 类并覆盖其getFilter() 方法的自定义适配器解决了我的问题。通过这样做,列表将不会根据放置在 TextField 中的任何文本进行过滤,并且将显示所有项目。

public class MyAdapter extends ArrayAdapter
    public MyAdapter(@NonNull Context context, int resource) 
        super(context, resource);
    

    public MyAdapter(@NonNull Context context, int resource, int textViewResourceId) 
        super(context, resource, textViewResourceId);
    

    public MyAdapter(@NonNull Context context, int resource, @NonNull Object[] objects) 
        super(context, resource, objects);
    

    public MyAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull Object[] objects) 
        super(context, resource, textViewResourceId, objects);
    

    public MyAdapter(@NonNull Context context, int resource, @NonNull List objects) 
        super(context, resource, objects);
    

    public MyAdapter(@NonNull Context context, int resource, int textViewResourceId, @NonNull List objects) 
        super(context, resource, textViewResourceId, objects);
    

    @NonNull
    @Override
    public Filter getFilter() 
        return new Filter() 
            @Override
            protected FilterResults performFiltering(CharSequence constraint) 
                return null;
            

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) 

            
        ;
    


【讨论】:

【参考方案4】:

最终我继承了ArrayAdapter,通过覆盖它的getFilter 方法禁用了过滤器,并在“文本更改”事件期间创建了我的HTTPRequest

【讨论】:

嗨,谢谢阿隆,我有同样的问题。如果您可以发布一些相关代码,我将不胜感激。提前致谢 请添加一些代码或描述您的解决方案。我完全坚持这一点。 @Rajivyadav Krzysztow 的新答案对您有帮助吗? 我让所有这些都以相同的方式工作。子类 ArrayAdapter;像在 performFiltering() 中所做的那样,覆盖返回 null 的 getFilter()。我还从 onTextChanged() 的 web api 调用中获取下拉数据;调用 AsyncTask 来检索数据并在 onPostExecute() 中设置适配器列表和 notifyDataSetChanged()。我在我的 ArrayAdapter 中覆盖 getView() 以设置下拉布局项。我不得不怀疑 AutoCompleteTextView 是否是正确的解决方案,但我没有更好的解决方案。而且,我还没有弄清楚如何在项目选择上设置文本。 啊! AutoCompleteTextView.setOnClickListener(...) 在下拉列表是数据类的下拉列表中选择项目时调用 setText()。

以上是关于AutoCompleteTextView - 禁用过滤的主要内容,如果未能解决你的问题,请参考以下文章

AutoCompleteTextView 项目选择触发事件

AutoCompleteTextView的使用

AutoCompleteTextView

AutoCompleteTextView - 我正在使用autocompletetextview,它显示来自API的值(返回名称和代码)

如何在 AutoCompleteTextView 中定位光标

AutoCompleteTextView