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

自定义Adapter的AutoCompleteTextView选中项获取及异常解决

AutoCompleteTextView自定义Adapter选中异常修复方案

问题描述

实现了支持加载图标与文本的自定义Adapter,下拉列表效果如下:
自定义Adapter下拉列表效果

选中列表项时出现两个异常:

  • AutoCompleteTextView内无法显示选中项对应的图标
  • 选中项文本可正常显示,但无法再次修改选项,点击下拉箭头无法唤起列表

以上异常仅在添加如下Item点击监听代码后触发:

exchangeBinding.autoCompleteTextView.setOnItemClickListener(OnItemClickListener { parent, view, position, id ->
    val item = parent.getItemAtPosition(position)
    if (item is PaymentMethod) {
        exchangeBinding.autoCompleteTextView.setText(item.paymentMethodName)
        exchangeBinding.autoCompleteTextView.setCompoundDrawablesWithIntrinsicBounds(item.paymentMethodIcon, 0, 0,0)
    
    }
})

问题根因

  1. 下拉无法唤起:直接调用setText(CharSequence)单参数方法时,AutoCompleteTextView会默认用传入的文本作为关键词过滤适配器数据源,过滤后列表无匹配结果时,下拉列表自然无法弹出。
  2. 图标不显示:setText()调用后会触发控件重绘,重绘流程会重置未通过控件固有属性配置的复合图标,在点击回调中同步设置的图标会被重绘流程覆盖,导致无法显示。

修复实现

修正后的点击监听代码

exchangeBinding.autoCompleteTextView.setOnItemClickListener(OnItemClickListener { parent, view, position, id ->
    val item = parent.getItemAtPosition(position) as? PaymentMethod ?: return@OnItemClickListener
    // 传入第二个参数false,禁止setText触发适配器自动过滤,保证下拉数据源不被清空
    exchangeBinding.autoCompleteTextView.setText(item.paymentMethodName, false)
    // 将光标移动到文本末尾,避免光标位置异常
    exchangeBinding.autoCompleteTextView.setSelection(exchangeBinding.autoCompleteTextView.text.length)
    // 延后执行图标设置,等控件setText触发的重绘流程完成后再赋值,避免被覆盖
    exchangeBinding.autoCompleteTextView.post {
        exchangeBinding.autoCompleteTextView.setCompoundDrawablesWithIntrinsicBounds(
            item.paymentMethodIcon, 0, 0, 0
        )
    }
})

更优实现建议

如果要彻底避免状态不一致问题,不建议在点击监听中手动处理文本和图标设置。可以在自定义Adapter中重写对应视图渲染逻辑,区分下拉项布局和控件选中态展示布局,让AutoCompleteTextView自动通过适配器完成选中项的文本、图标渲染,不需要额外写点击监听处理选中逻辑,稳定性更高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:57:55