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,它显示来自API的值(返回名称和代码)