动态更新AutoCompleteTextView:在选择项目后再次弹出下拉菜单。

3
我正在动态更新AutoCompleteTextView,遇到了两个问题。
  • 当选择一个项目时,会触发新的onTextChanged事件。如下面的代码所示,会有一个新的请求来获取新的可选项,因此onTextChanged事件会导致AutoComplete再次显示下拉框!有没有一种干净的方法来解决这个问题?!

  • 我从自动完成中获得的结果是在调用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) {}
    }
);
1个回答

3
为了实现动态适配器,需要实现自定义过滤器类并重写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);

}

}

希望对某些人有所帮助。

即使从下拉列表中选择了一个项目,光标仍然在自动完成文本视图上闪烁,并且下拉菜单仍然会弹出。请帮忙:( - O__O

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接