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

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类,可以自定义适配器重写渲染逻辑:

  1. 首先给DeviceBT类添加name字段的公开获取方法:
class DeviceBT(
    private val id: Int,
    private val name: String,
    private val macAddress: String
) {
    // 新增公开get方法供适配器调用
    fun getShowName(): String = name
}
  1. 自定义适配器类,重写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
    }
}
  1. 在MainActivity中替换原有适配器绑定逻辑即可:
// 初始化自定义适配器
val adapter = BTDeviceSpinnerAdapter(this, yourDeviceArrayList)
// 设置下拉项的布局样式
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
// 绑定到Spinner控件
yourSpinner.adapter = adapter

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:24:03