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

如何为Material Exposed Dropdown配置自定义适配器并解决相关异常

问题修复方案

两个异常分别由自定义Adapter实现缺失、错误覆盖控件默认监听逻辑导致,按以下步骤修改即可:

1. 解决选中后显示内存地址字符串问题

ArrayAdapter默认会调用数据项的toString()方法获取输入框展示文本,自定义AdapterItem未重写该方法时,默认返回类名@内存哈希值格式的字符串,就会出现类似@71232的显示内容。
另外你实现的initView方法从未被系统调用——你没有重写Adapter必需的getView()、getDropDownView()方法,下拉列表初始展示正常只是因为构造函数传入了布局和文本id,走了ArrayAdapter默认的下拉项文本填充逻辑,输入框内的文本填充仍然走默认的toString()逻辑。
修复操作:

  • 为AdapterItem类重写toString()方法,返回需要展示的文本:
public static class AdapterItem {
    public String text;
    public int image;

    // 省略你原有成员、构造方法等代码

    @NonNull
    @Override
    public String toString() {
        return text;
    }
}
  • 重写Adapter的两个视图方法,区分输入框展示态和下拉列表态:输入框内只展示纯文本,下拉项才加载图片+文本的布局,把你写的视图初始化逻辑放到下拉项方法中:
public class CustomArrayAdapter extends ArrayAdapter<CustomArrayAdapter.AdapterItem> {

    public CustomArrayAdapter(Context context, ArrayList<AdapterItem> itemList) {
        super(context, R.layout.item_dropdown, R.id.tv_text, itemList);
    }

    // 输入框内的展示视图,走默认纯文本逻辑即可,不需要加载图片
    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        return super.getView(position, convertView, parent);
    }

    // 下拉列表项视图,加载图片+文本布局
    @Override
    public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_dropdown, parent, false);
        }
        TextView tvText = convertView.findViewById(R.id.tv_text);
        ImageView ivImage = convertView.findViewById(R.id.iv_image);
        AdapterItem currentItem = getItem(position);
        if (currentItem != null) {
            tvText.setText(currentItem.text);
            ivImage.setImageDrawable(getContext().getDrawable(currentItem.image));
        }
        return convertView;
    }
}

2. 解决第二次点击下拉框不弹出问题

该问题是因为你自定义了setOnItemClickListener,手动调用setText()破坏了AutoCompleteTextView内部的选中状态、下拉弹出/关闭的判断逻辑。
直接删除你写的setOnItemClickListener全部代码即可,控件内置的默认监听器会自动完成选中项文本填充、下拉关闭、状态重置的全流程,不需要手动设置文本。

适配器绑定逻辑

原有绑定逻辑不需要修改,保持如下写法即可:

CustomArrayAdapter customArrayAdapter = new CustomArrayAdapter(getContext(), list);
autoCompleteTextView.setAdapter(customArrayAdapter);

内容的提问来源于stack exchange,提问作者Pujan Shrestha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:54:15