You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AutoCompleteTextView无法读取ArrayList数据,寻求Adapter问题排查帮助

排查AutoCompleteTextView无法读取ArrayList数据的问题

我帮你梳理一下代码里的几个关键问题,这些应该就是导致AutoCompleteTextView没显示建议项的核心原因:

1. Adapter泛型缺失与类型处理错误

你的AutoSuggestAdapter继承ArrayAdapter时未指定泛型,且多处对ItemModel的类型转换逻辑错误:

  • ArrayAdapter应明确指定为ArrayAdapter<ItemModel>,避免无意义的类型强制转换
  • getView里直接把ItemModel强转成CharSequence是错误的,需要调用ItemModel的属性方法(比如getName())获取显示文本
  • convertResultToString里直接将ItemModel转成String也不合理,同样要取它的文本属性

2. tempItems未初始化原始数据

你只初始化了空的tempItems,但没有把传入的items数据复制进去,导致performFiltering里遍历的是空列表,自然不会生成任何建议项。

3. Filter中的类型不匹配问题

publishResults里把results.values强制转换成ArrayList<String>是错误的,因为我们的建议列表是ItemModel类型而非String;而且循环里每次调用notifyDataSetChanged效率极低,应该在循环结束后统一通知数据变更。

4. Activity中不必要的数组包装

你用ArrayList<ItemModel>[] itemlist这种数组包装完全没必要,直接用普通的ArrayList<ItemModel>即可,同时要确保你确实往这个列表里添加了商品数据(比如itemlist.add(new ItemModel("商品名称")))。

修正后的Adapter代码

public class AutoSuggestAdapter extends ArrayAdapter<ItemModel> {
    private Context mCtx;
    private int resource;
    private ArrayList<ItemModel> items;
    private ArrayList<ItemModel> tempItems;
    private List<ItemModel> suggestions;

    public AutoSuggestAdapter(Context mCtx, int resource, ArrayList<ItemModel> items) {
        super(mCtx, resource, 0, items);
        this.mCtx = mCtx;
        this.resource = resource;
        this.items = items;
        tempItems = new ArrayList<>(items); // 初始化时直接复制原始数据
        suggestions = new ArrayList<>(items);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) mCtx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(resource, parent, false);
        }
        ItemModel item = getItem(position); // 用getItem替代items.get(position)更安全
        if (item != null && view instanceof TextView) {
            // 这里假设ItemModel有getName()方法返回商品名称,请根据你的实际类调整
            ((TextView) view).setText(item.getName());
        }
        return view;
    }

    @Override
    public Filter getFilter() {
        return itemFilter;
    }

    Filter itemFilter = new Filter() {
        @Override
        public CharSequence convertResultToString(Object resultValue) {
            if (resultValue instanceof ItemModel) {
                // 返回ItemModel的名称属性
                return ((ItemModel) resultValue).getName();
            }
            return super.convertResultToString(resultValue);
        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults filterResults = new FilterResults();
            if (constraint != null) {
                suggestions.clear();
                String constraintStr = constraint.toString().toLowerCase();
                for (ItemModel item : tempItems) {
                    // 匹配商品名称,注意要调用ItemModel的属性方法
                    if (item.getName().toLowerCase().contains(constraintStr)) {
                        suggestions.add(item);
                    }
                }
                filterResults.values = suggestions;
                filterResults.count = suggestions.size();
            } else {
                // 无输入时返回全部原始数据
                suggestions.clear();
                suggestions.addAll(tempItems);
                filterResults.values = suggestions;
                filterResults.count = suggestions.size();
            }
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            if (results != null && results.count > 0) {
                clear();
                // 正确转换为ItemModel列表
                ArrayList<ItemModel> filterList = (ArrayList<ItemModel>) results.values;
                addAll(filterList);
                notifyDataSetChanged();
            } else {
                // 无匹配结果时清空列表
                clear();
                notifyDataSetChanged();
            }
        }
    };
}

修正后的Activity代码

AutoCompleteTextView actv = findViewById(R.id.additemtobillname);
// 去掉不必要的数组包装
ArrayList<ItemModel> itemlist = new ArrayList<>();
// 务必确保你已经往itemlist中添加了商品数据,示例:
// itemlist.add(new ItemModel("苹果"));
// itemlist.add(new ItemModel("香蕉"));
AutoSuggestAdapter adapter = new AutoSuggestAdapter(this, android.R.layout.simple_spinner_dropdown_item, itemlist);
actv.setAdapter(adapter);
actv.setThreshold(1);

最后提醒:你的ItemModel类需要补充getName()(或你自定义的获取商品名称的方法),如果还未实现,要记得补上哦。

内容的提问来源于stack exchange,提问作者Niroop Nife

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:45:37