如何在Kotlin中从MultiSelectSpinner获取逗号分隔的项ID
解决MultiSelectSpinner获取选中项Id并拼接字符串的问题
我明白你的困扰了——你现在只把工程师的名字传给了MultiSelectSpinner,没法直接关联到对应的Id。咱们可以通过保留完整的工程师数据列表,在选中回调里根据选中位置匹配Id来解决这个问题,具体步骤如下:
步骤1:保留完整的Engineer列表引用
不要只提取名字到单独的列表,直接保留addJobResponse.engineerList的引用,这样我们能随时通过位置拿到对应的Id。
步骤2:修改MultiSelectSpinner的初始化与选中回调
在设置Spinner选项时,从Engineer列表生成名字列表;在选中回调里,遍历选中的布尔数组,找到选中的位置,取出对应Engineer的Id,最后拼接成逗号分隔的字符串设置到TextView中。
修改后的Kotlin代码如下:
// 直接保留完整的工程师列表(注意判空,避免空指针) val engineerList = addJobResponse.engineerList ?: emptyList() // 从工程师列表生成名字列表,传给MultiSelectSpinner val engineerNames = engineerList.map { it.name.orEmpty() } spin_engineer.setItems(engineerNames) .setListener<BaseMultiSelectSpinner>(object: BaseMultiSelectSpinner.MultiSpinnerListener { override fun onItemsSelected(selected: BooleanArray) { // 收集所有选中项的Id,过滤掉可能为null的情况 val selectedIds = selected.mapIndexedNotNull { index, isSelected -> if (isSelected) engineerList[index].id?.toString() else null } // 将Id列表拼接成逗号分隔的字符串 val idsString = selectedIds.joinToString(",") // 设置到TextView中 tv_engineer_ids.text = idsString } })
关键说明:
mapIndexedNotNull:遍历选中数组的索引,当该位置被选中时,取出对应Engineer的Id并转为字符串,同时自动过滤掉Id为null的项(如果有的话)joinToString(","):直接将Id列表拼接成逗号分隔的字符串,省去手动循环拼接的麻烦- 我们保留了完整的
engineerList,所以能通过选中的位置精准匹配到对应的Id,而不是只依赖名字(避免重名导致的错误)
你的Engineer数据类和布局代码不需要修改,直接用原来的就好~
内容的提问来源于stack exchange,提问作者Keval Gangani
相关产品推荐
相关产品推荐

