Android Kotlin中Spinner调用notifyDataSetChanged()无法动态更新求助
解决Spinner动态更新失效的问题
嘿,你这是踩了个Android Adapter的常见小坑啦!我来帮你分析问题根源,再给你两个可行的解决方案~
问题核心原因
你当前的代码里,dataAdapter初始化时绑定的是最初的tempArray(也就是options数组)的引用。当你在Spinner1的选中事件里执行tempArray = taiwan时,只是把tempArray这个变量的指向改成了新的taiwan数组,但dataAdapter内部仍然持有原来options数组的引用——相当于你换了新数据源,但Adapter根本没察觉到,所以调用notifyDataSetChanged()自然不会有任何效果。
解决方案一:用ArrayList替代固定数组(推荐)
数组的长度是固定的,没法动态修改内容,而ArrayList支持动态增删,Adapter能正确感知到它的变化。修改步骤如下:
- 把
tempArray改成ArrayList<String>类型 - 初始化时传入ArrayList包装后的数据源
- 在选中事件里清空原数据,添加新的
taiwan数据,再调用notifyDataSetChanged()
修改后的代码示例:
spinnerOne = findViewById(R.id.spinner1) as Spinner spinnerTwo = findViewById(R.id.spinner2) as Spinner val options = arrayOf("111", "222", "333", "222", "333", "222", "333", "222", "333", "222", "333", "222", "333", "222", "333", "222", "333", "222", "333", "222", "333", "222", "333", "222", "333") val taiwan = arrayOf("xxx","yyy","zzz") // 改成ArrayList,初始化时把options转成ArrayList var tempArray = ArrayList<String>(options.asList()) spinnerOne.adapter = ArrayAdapter<String>(this, R.layout.item, options) // 基于ArrayList创建Adapter val dataAdapter = ArrayAdapter<String>(this, R.layout.item, tempArray) spinnerTwo.setAdapter(dataAdapter) spinnerOne.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{ override fun onNothingSelected(parent: AdapterView<*>?) {} override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { // 清空原数据,添加新的taiwan数组内容 tempArray.clear() tempArray.addAll(taiwan.asList()) // 现在notify就能生效了 dataAdapter.notifyDataSetChanged() } } // Spinner2的监听保持不变 spinnerTwo.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{ override fun onNothingSelected(parent: AdapterView<*>?) {} override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { // 你的业务逻辑 } }
解决方案二:直接重新设置Adapter(简单粗暴)
如果不想改ArrayList,也可以在选中事件里直接创建新的ArrayAdapter,然后给Spinner2重新设置,这样也能实现更新:
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { // 直接创建新的Adapter并设置给Spinner2 val newAdapter = ArrayAdapter<String>(this, R.layout.item, taiwan) spinnerTwo.adapter = newAdapter }
这个方法虽然简单,但每次选中都会创建新的Adapter对象,适合数据源变化不频繁的场景。
内容的提问来源于stack exchange,提问作者GPH
相关产品推荐
相关产品推荐

