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
相关产品推荐
相关产品推荐

