Android Studio Kotlin Spinner绑定ArrayList如何正确显示name属性
问题根因
ArrayAdapter默认调用绑定对象的toString()方法渲染列表文本,你没有重写DeviceBT类的toString()方法时,系统默认返回「类名+内存哈希值」的字符串,就是你看到的异常输出。
解决方案
下面给出两种常用的实现方案,可以根据你的业务需求选择:
方案1:重写Model类的toString()方法(推荐,实现成本最低)
直接在DeviceBT类中重写toString()方法,返回你需要展示的name字段即可,类内部可以直接访问私有属性,不需要额外调整属性的访问权限:
class DeviceBT( private val id: Int, private val name: String, private val macAddress: String ) { override fun toString(): String { // 可根据需求自定义返回格式,比如同时展示名称和MAC地址 return "$name($macAddress)" return name } }
如果你用的是Kotlin数据类(data class),写法完全一致,不会影响数据类本身的特性。
方案2:自定义ArrayAdapter(适合不需要修改原有Model类逻辑的场景)
如果你在其他业务场景需要用到DeviceBT原生的toString()逻辑,不想修改原有Model类,可以自定义适配器重写渲染逻辑:
- 首先给
DeviceBT类添加name字段的公开获取方法:
class DeviceBT( private val id: Int, private val name: String, private val macAddress: String ) { // 新增公开get方法供适配器调用 fun getShowName(): String = name }
- 自定义适配器类,重写
getView和getDropDownView方法:
import android.content.Context import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.TextView class BTDeviceSpinnerAdapter( context: Context, private val deviceList: List<DeviceBT> ) : ArrayAdapter<DeviceBT>(context, android.R.layout.simple_spinner_item, deviceList) { // 自定义Spinner收起状态的展示样式 override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { val itemView = super.getView(position, convertView, parent) val currentDevice = deviceList[position] itemView.findViewById<TextView>(android.R.id.text1).text = currentDevice.getShowName() return itemView } // 自定义Spinner下拉列表的展示样式 override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View { val dropItemView = super.getDropDownView(position, convertView, parent) val currentDevice = deviceList[position] dropItemView.findViewById<TextView>(android.R.id.text1).text = currentDevice.getShowName() return dropItemView } }
- 在MainActivity中替换原有适配器绑定逻辑即可:
// 初始化自定义适配器 val adapter = BTDeviceSpinnerAdapter(this, yourDeviceArrayList) // 设置下拉项的布局样式 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) // 绑定到Spinner控件 yourSpinner.adapter = adapter
内容的提问来源于stack exchange,提问作者grante eric
相关产品推荐
相关产品推荐

