【问题标题】:Dynamic updating AutoCompleteTextView popup the drop down again after item selected选择项目后,动态更新 AutoCompleteTextView 再次弹出下拉菜单
【发布时间】:2012-02-02 12:42:53
【问题描述】:

我正在动态更新 AutoCompleteTextView,我面临两个问题。

  • 当项目被选中时,会有一个新的 onTextChanged 事件,正如您在下面的代码中看到的,有一个获取新可选项目的新请求,因此 onTextChanged 事件会导致自动完成再次显示下拉菜单!有没有干净的方法来解决它?!

  • 在调用 notifyDataSetChange() 之前,我从自动完成获得的结果来自上一个适配器,我该如何实现?!

代码如下:

AutoCompleteTextView acCountry = (AutoCompleteTextView)layout.findViewById(R.id.autoComplete);
final ArrayAdapter<RMAutoComplete.ListItem> countriesAdapter = new ArrayAdapter<RMAutoComplete.ListItem>(this.context,android.R.layout.simple_dropdown_item_1line);
acCountry.setAdapter(countriesAdapter);
acCountry.addTextChangedListener(new TextWatcher() {

        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s.length() > 1)
            {
                new AsyncTask<String, Void, List<RMAutoComplete.ListItem>>(){

                    @Override
                    protected List<ListItem> doInBackground(String... params) {
                        List<ListItem> l = null;
                        try {
                            l = location.getCountryData(params[0]);
                        } catch (Exception e) {
                            Log.e(TAG,"error when getCountryData",e);
                        }
                        return l;
                    }

                    @Override
                    protected void onPostExecute(List<ListItem> countries) {
                        countriesAdapter.clear();
                        if (countries != null)
                            for (ListItem listItem : countries) {
                                countriesAdapter.add(listItem);
                            }
                        countriesAdapter.notifyDataSetChanged();
                    }
                }.execute(s.toString());
            }
        }

        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

        public void afterTextChanged(Editable s) {}
    }
);

【问题讨论】:

    标签: java android autocomplete


    【解决方案1】:

    要实现动态适配器,需要做的是实现自定义 Filter 类并覆盖 performFiltering 和 publishResults 方法。

    在 performFiltering 中创建 FilterResults 的新实例并初始化他的值并使用新项目计数..(此方法默认在新线程上工作!)如下所示:

    @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults fr = null;
            if (constraint != null)
            {
                List<ListItem> list = getFilterdValues(constraint.toString());
    
                if (list != null)
                {
                    fr = new FilterResults();
                    fr.values = list;
                    fr.count = list.size();
                }
            }
            return fr;
        }
    

    并在 publishResults 中将结果添加到适配器,如下所示:

    @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            AutoCompleteAdapter.this.clear();
            if (results != null)
            {
                if (results.values != null)
                {
                    List<ListItem> items = (List<ListItem>) results.values;
    
                        for (ListItem listItem : items) {
                            AutoCompleteAdapter.this.add(listItem);
                        }
    
                    if (items.size() > 0)
                    {
                        AutoCompleteAdapter.this.notifyDataSetChanged();
                        return;
                    }
                }
            }
            AutoCompleteAdapter.this.notifyDataSetInvalidated();
        }
    

    同样重要的是,您需要自定义适配器并使用您自己的新自定义过滤器类覆盖 getFilter,如下所示:

    public class AutoCompleteAdapter extends ArrayAdapter<RMAutoComplete.ListItem> 
    {
    
    
    private CustomFilter _customFilter = null;
    
    @Override
    public Filter getFilter() {
    
        if (_customFilter == null)
            _customFilter = new CustomFilter();
        return _customFilter;
    }
    
    
    public AutoCompleteAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    
    }
    
    }
    

    希望对某人有所帮助..

    【讨论】:

    • 光标在 autocompleteTextview 上仍然闪烁,即使从下拉列表中选择了一个项目,下拉菜单也会弹出。请帮忙:(
    猜你喜欢
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多