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

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

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

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

【问题讨论】:

  • 失去了半天。谢谢兄弟:)

标签: java android filter android-arrayadapter autocompletetextview


【解决方案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()。
      猜你喜欢
      • 2012-12-04
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2014-04-21
      相关资源
      最近更新 更多