自定义Adapter的AutoCompleteTextView选中项获取及异常解决
AutoCompleteTextView自定义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) } })
问题根因
- 下拉无法唤起:直接调用
setText(CharSequence)单参数方法时,AutoCompleteTextView会默认用传入的文本作为关键词过滤适配器数据源,过滤后列表无匹配结果时,下拉列表自然无法弹出。 - 图标不显示:
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
相关产品推荐
相关产品推荐

