Kotlin中如何为Spinner绑定SQLite数据库对应的id与name值
实现方案
步骤1:修正AnimalData类错误并添加toString方法
你当前的AnimalData类第一个构造函数中存在this.note = note的报错代码,类中未定义note属性,先删除该行。之后重写toString方法,控制Spinner默认展示的选项内容为动物名称:
class AnimalData{ var id : Int = 0 var name : String = "" var species : String = "" var origin : String = "" constructor(id: Int, name: String, species: String, origin: String){ this.id = id this.name = name this.species = species this.origin = origin } constructor(id: Int, name :String){ this.id = id this.name = name } // 控制Spinner选项展示的文本为动物名称 override fun toString(): String { return name } }
步骤2:给Spinner绑定AnimalData数据源
直接将你查询得到的animals列表作为适配器的数据源,不需要单独拆分id和name列表:
// 替换成你布局里Spinner的实际id val animalSpinner: Spinner = findViewById(R.id.animal_spinner) // 初始化适配器,使用系统默认Spinner样式,数据源为AnimalData列表 val adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, animals) // 设置下拉列表的样式 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) animalSpinner.adapter = adapter
步骤3:获取选中项的id和名称
选中项直接对应完整的AnimalData对象,完全不依赖position和id的映射关系,不会出现删除数据后id错位的问题:
// 选中事件监听 animalSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { val selectedAnimal = parent?.getItemAtPosition(position) as AnimalData // 直接获取数据库存储的id和对应名称 val selectedAnimalId = selectedAnimal.id val selectedAnimalName = selectedAnimal.name // 后续基于selectedAnimalId执行业务逻辑即可 } override fun onNothingSelected(parent: AdapterView<*>?) { // 无选中状态的处理逻辑,按需编写 } } // 也可以在任意时机主动获取当前选中项 val currentAnimal = animalSpinner.selectedItem as AnimalData val currentId = currentAnimal.id
实现说明
- Spinner每个选项绑定的是完整的AnimalData对象,仅通过重写
toString方法控制展示的文本为name,对象内部的id始终和数据库存储的id一致,和选项的位置没有绑定关系 - 数据库增删数据后只需要重新查询最新的AnimalData列表、刷新Spinner适配器即可,不会出现id和选项错位的问题
内容的提问来源于stack exchange,提问作者Droid Buddy
相关产品推荐
相关产品推荐

