微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不从资源创建时无法选择Android微调项

如何解决不从资源创建时无法选择Android微调项

我正在使用 kotlin 和 android 8.0,我的代码中有 2 个微调器,其中 1 个是使用来自资源的字符串数组创建的,另一个是使用 ArrayList 创建的。对于使用 ArrayList 创建的微调器,当单击该项目时,它不会运行 OnItemSelected 函数并且不会更新微调器。

这是我的微调器的 kotlin 代码

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val modules = ArrayList<Module>()
        val bufferedReader = BufferedReader(InputStreamReader(resources.openRawResource(R.raw.mod_code)))
        var line = bufferedReader.readLine()
        while(line != null) {
            val values = line.split(",")
            modules.add(Module(values[0].replace("\uFEFF","").toInt(),values[1],values[2].replace("\uFEFF","").todouble()))
            line = bufferedReader.readLine()
        }

        val moduleCodeArray = ArrayList<String>()
        val yearSpinner: Spinner = findViewById(R.id.year)
        yearSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
            override fun onItemSelected(parent: AdapterView<*>?,view: View?,position: Int,id: Long) {
                val item = parent?.getItemAtPosition(position).toString()
                Toast.makeText(parent?.context,"Selected: $item",Toast.LENGTH_LONG).show()

                moduleCodeArray.clear()
                for(module in modules) {
                    if(module.year == position + 1) {
                        moduleCodeArray.add(module.moduleCode)
                    }
                }
            }
            override fun onnothingSelected(parent: AdapterView<*>?) {
            }
        }
        ArrayAdapter.createFromresource(
                this,R.array.years,R.layout.custom_spinner
        ).also { adapter ->
            adapter.setDropDownViewResource(R.layout.custom_spinner_dropdown)
            yearSpinner.adapter = adapter
        }


        println(moduleCodeArray)
        val moduleCodeSpinner = findViewById<Spinner>(R.id.module_code)
        moduleCodeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(parent: AdapterView<*>?,Toast.LENGTH_LONG).show()
            }

            override fun onnothingSelected(parent: AdapterView<*>?) {}
        }

        ArrayAdapter(
            this,R.layout.custom_spinner,moduleCodeArray
        ).also { adapter ->
            adapter.setDropDownViewResource(R.layout.custom_spinner_dropdown)
            moduleCodeSpinner.adapter = adapter
        }

    }
}

编辑:我已经解决了这个问题!在我提供的代码中,您可以看到我的 ArrayList 被填充到一个 onItemSelected 函数中,出于某种原因,ArrayAdapter 也必须在该函数中,因此正确的代码应该如下所示。

val modules = ArrayList<Module>()
        val bufferedReader = BufferedReader(InputStreamReader(resources.openRawResource(R.raw.mod_code)))
        var line = bufferedReader.readLine()
        while(line != null) {
            val values = line.split(","").todouble()))
            line = bufferedReader.readLine()
        }

        val moduleCodeArray = ArrayList<String>()
        val moduleCodeSpinner = findViewById<Spinner>(R.id.module_code)
        val yearSpinner: Spinner = findViewById(R.id.year)
        yearSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
            override fun onItemSelected(parent: AdapterView<*>?,Toast.LENGTH_LONG).show()

                moduleCodeArray.clear()
                for(module in modules) {
                    if(module.year == position + 1) {
                        moduleCodeArray.add(module.moduleCode)
                    }
                }

                ArrayAdapter(
                    applicationContext,moduleCodeArray
                ).also { adapter ->
                    adapter.setDropDownViewResource(R.layout.custom_spinner_dropdown)
                    moduleCodeSpinner.adapter = adapter
                }
            }
            override fun onnothingSelected(parent: AdapterView<*>?) {
            }
        }
        ArrayAdapter.createFromresource(
                this,R.layout.custom_spinner
        ).also { adapter ->
            adapter.setDropDownViewResource(R.layout.custom_spinner_dropdown)
            yearSpinner.adapter = adapter
        }

        moduleCodeSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(parent: AdapterView<*>?,Toast.LENGTH_LONG).show()
            }

            override fun onnothingSelected(parent: AdapterView<*>?) {}
        }

解决方法

您的代码似乎正确,我使用了您提供的相同代码并且运行正常。

你可能在 custom_spinner 或 custom_spinner_dropdown 有错误!![你可以分享这些布局]

这是我所做的: spinner example

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。