Android Studio中TextInputLayout下拉选中显示对象哈希而非实际值
问题根因
AutoCompleteTextView选中条目后,会自动调用选中数据项的toString()方法获取待展示文本。你当前的VendorResponse实体类没有重写该方法,系统会默认调用Object类的实现,输出格式为类全路径@内存哈希值,这就是选中后显示乱码的核心原因。
你观察到下拉列表内的选项渲染正常,是因为自定义Adapter的getView()方法是手动从VendorResponse对象中提取供应商名称字段,赋值给列表项的TextView,这套渲染逻辑和选中后的文本展示是两套独立流程,不受上述问题影响。
解决方案
选下面任意一种即可解决当前问题:
方案1:重写实体类的toString(改动最少)
直接在VendorResponse数据类中添加重写逻辑,返回需要展示的供应商名称:
// VendorResponse.kt data class VendorResponse( val vendorId: String, val vendorName: String, // 原有其他业务字段保持不变 ) { override fun toString(): String { return vendorName } }
该方案优势为所有使用该实体类作为下拉数据源的场景都会自动生效,无需单独修改Adapter代码。如果该实体类在其他业务场景下有不同的toString展示需求,则不适用此方案。
方案2:重写Adapter的getItem(耦合更低)
在自定义的VendorRequestBaseAdapter中重写getItem方法,直接返回当前位置需要展示的文本,不返回整个实体对象:
// VendorRequestBaseAdapter 类内添加 override fun getItem(position: Int): Any { // 直接返回要展示的供应商名称字符串 return vendorItemsList[position].vendorName }
该方案改动范围仅局限于当前下拉组件的Adapter,不会对其他使用VendorResponse实体的业务逻辑造成影响,更适配你后续开发级联下拉的场景。
级联开发注意点
后续实现三级联动逻辑时,不要直接读取AutoCompleteTextView上的展示文本来获取选中项的业务ID,需要通过条目点击监听维护选中的完整对象记录:
// 给AutoCompleteTextView添加选中监听 selectVendor.onItemClickListener = { _, _, position, _ -> // 存下选中的完整供应商对象,提取其中的ID去请求下一级下拉数据 val selectedVendor = vendorItemsArrayList?.get(position) // 在这里触发下一级下拉的数据加载逻辑即可 }
内容的提问来源于stack exchange,提问作者Janou
相关产品推荐
相关产品推荐

