Kotlin:如何提取Spinner选中项的description属性值
问题:从Spinner选中项提取Mood的description属性
我创建了包含image和description属性的Mood数据类:
data class Mood(val image: Int, val description: String)
接着实现了Spinner适配器并关联到Spinner控件:
binding.todayMood.adapter = activity?.applicationContext?.let { MoodArrayAdapter( it, listOf( Mood(R.drawable.ic_emotion_1, "많이 슬퍼요"), Mood(R.drawable.ic_emotion_2, "슬퍼요"), Mood(R.drawable.ic_emotion_3, "평범해요"), Mood(R.drawable.ic_emotion_4, "좋아요"), Mood(R.drawable.ic_emotion_5, "많이 좋아요"), ) ) }
我希望将Spinner选中项的description值存入数据库,但binding.todayMood.selectedItem返回的是Any类型,无法直接通过binding.todayMood.selectedItem.description访问属性,调用toString()得到的是Mood(image=123, description="hi")格式的字符串,请问如何仅提取description值?
解决方案
1. 直接类型强转
selectedItem本质是你传入的Mood对象,只需将其强转为Mood类型即可直接访问description属性:
val selectedMood = binding.todayMood.selectedItem as Mood val targetDescription = selectedMood.description // 此时targetDescription就是可存入数据库的字符串
为避免空指针或类型转换异常,推荐使用安全转换+空合并运算符做兜底:
val targetDescription = (binding.todayMood.selectedItem as? Mood)?.description ?: ""
2. 优化适配器的类型返回
如果你的MoodArrayAdapter继承自ArrayAdapter,可以重写getItem()方法明确返回Mood类型,让代码更清晰:
class MoodArrayAdapter( context: Context, private val moodItems: List<Mood> ) : ArrayAdapter<Mood>(context, 0, moodItems) { override fun getItem(position: Int): Mood { return moodItems[position] } // 重写getView等方法实现Spinner的UI展示... }
之后通过选中位置获取Mood对象:
val selectedPosition = binding.todayMood.selectedItemPosition val selectedMood = binding.todayMood.adapter.getItem(selectedPosition) val targetDescription = selectedMood.description
3. 不推荐:解析toString()结果
虽然可以通过字符串截取解析toString()的输出获取description,但这种方式依赖Mood类的toString()实现,一旦类结构或toString()逻辑变更,代码就会失效,因此不建议使用。
内容的提问来源于stack exchange,提问作者Hyejung
相关产品推荐
相关产品推荐

