Kotlin中Spinner调用更新函数后选中项无变化,求排查原因
问题描述
我给countrySpinner设置了选中项监听器,每次切换选中项时都会调用updateCurrencySpinner()函数,期望该函数根据countrySpinner的选中位置更新currenciesSpinner的选中项,但实际currenciesSpinner并未更新,请问这是什么原因?
相关代码
updateCurrencySpinner函数
private fun updateCurrencySpinner() { // Update selected item form the currency spinner based on the country spinner val currency = when (serviceSpinner.selectedItemPosition) { 0 -> 0 1 -> 0 2 -> 1 3 -> 2 else -> 0 } currenciesSpinner.setSelection(currency) }
监听器代码
countrySpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { updateCurrencySpinner() } override fun onNothingSelected(parent: AdapterView<*>?) {} }
原因分析与解决办法
核心问题:逻辑混淆了Spinner
你的注释明确写了要基于countrySpinner更新货币选择器,但代码里却用了serviceSpinner.selectedItemPosition来判断,这完全是两个不同的Spinner!如果你的需求是跟着countrySpinner的选中项走,这里的逻辑完全错误。
修复方案
直接利用onItemSelected回调里的position参数(该参数就是countrySpinner当前选中的位置),修改函数逻辑:
- 给
updateCurrencySpinner添加参数,接收选中的国家位置:
private fun updateCurrencySpinner(selectedCountryPos: Int) { val currency = when (selectedCountryPos) { 0 -> 0 1 -> 0 2 -> 1 3 -> 2 else -> 0 } currenciesSpinner.setSelection(currency) }
- 在监听器里调用时传入
position:
countrySpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { updateCurrencySpinner(position) } override fun onNothingSelected(parent: AdapterView<*>?) {} }
其他排查点(若修复后仍无效)
- 确认
currenciesSpinner已正确设置Adapter,且Adapter中的数据条目数大于等于你要设置的currency值(比如currency=2时,Adapter至少要有3个条目,索引从0开始)。 - 确认
currenciesSpinner已通过findViewById或视图绑定正确关联到布局控件,不为null。 - 添加日志打印,验证
selectedCountryPos、currency的值是否符合预期,以及调用setSelection后currenciesSpinner.selectedItemPosition是否更新。
内容的提问来源于stack exchange,提问作者FleetAdmiralJakob
相关产品推荐
相关产品推荐

