【问题标题】:AutoCompleteTextView is showing wrong resultsAutoCompleteTextView 显示错误的结果
【发布时间】:2016-03-04 10:04:28
【问题描述】:

在这里:我正在输入“di”,但 AutoCompleteTextView 显示的是不相关的内容。

我是这样初始化的:

autocompleteAdapter = new AutoCompleteDropdownAdapter(MainActivity.activity,
android.R.layout.simple_list_item_1, autoCompleteStrings);
etSearch.setAdapter(autocompleteAdapter);

这是我的适配器(我尝试了标准的 ArrayAdapter,但结果相同)

class AutoCompleteDropdownAdapter extends ArrayAdapter<String> implements Filterable {

    Activity main;
    int rowLayout;
    List<String> strings;

    private ArrayList<String> originalValues;
    private ArrayFilter filter;

    public AutoCompleteDropdownAdapter(Activity main, int rowLayout, List<String> strings) {
        super(main, rowLayout, strings);
        this.main = main;
        this.rowLayout = rowLayout;
        this.strings = strings;
        originalValues = new ArrayList<String>(strings);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return super.getView(position, convertView, parent);
    }

    @Override
    public Filter getFilter() {
        if (filter == null) {
            filter = new ArrayFilter();
        }
        return filter;
    }

    private class ArrayFilter extends Filter {
        private Object lock;

        @Override
        protected FilterResults performFiltering(CharSequence prefix) {
            FilterResults results = new FilterResults();

            if (originalValues == null) {
                synchronized (lock) {
                    originalValues = new ArrayList<String>(strings);
                }
            }

            if (prefix == null || prefix.length() == 0) {
                synchronized (lock) {
                    ArrayList<String> list = new ArrayList<String>(originalValues);
                    results.values = list;
                    results.count = list.size();
                }
            } else {
                final String prefixString = prefix.toString().toLowerCase();

                ArrayList<String> values = originalValues;
                int count = values.size();

                ArrayList<String> newValues = new ArrayList<String>(count);

                for (int i = 0; i < count; i++) {
                    String item = values.get(i);
                    if (item.toLowerCase().contains(prefixString)) {
                        newValues.add(item);
                    }

                }

                results.values = newValues;
                results.count = newValues.size();
            }

            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {

        if(results.values!=null){
            ArrayList<String> tempStrings = (ArrayList<String>) results.values;
            strings.clear();
            strings.addAll(tempStrings);
        }else{
            strings = new ArrayList<String>();
        }
            if (results.count > 0) {
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }
    }

现在,当我调试 publishResults 方法时,它准确显示了我需要的 2 个结果,但是,AutoCompleteTextView 下拉了错误列表

【问题讨论】:

  • 您是否使用充气器并将文本设置为下拉项?如果您跳过某些内容,请添加适配器的所有代码
  • 不,只是 super.getView()

标签: java android android-arrayadapter android-adapter autocompletetextview


【解决方案1】:

类 ArrayFilter 扩展过滤器:

改变: if (item.toLowerCase().contains(prefixString)) {

到: if (item.toLowerCase().startsWith(prefixString)) {

【讨论】:

    【解决方案2】:

    我想你可以从这个例子中找到一些提示:

    https://github.com/gabu/gabubon2/blob/master/src/net/gabuchan/androidrecipe/recipe033/Recipe033Activity.java#L14

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recipe_033);
    
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_dropdown_item_1line, COUNTRIES);
        AutoCompleteTextView v = (AutoCompleteTextView)
                findViewById(R.id.auto_complete_text_view);
        v.setAdapter(adapter);
    }
    
    public void onButtonClick(View view) {
        AutoCompleteTextView v = (AutoCompleteTextView)
                findViewById(R.id.auto_complete_text_view);
        Toast.makeText(this, v.getText(), Toast.LENGTH_SHORT).show();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多