首页 > 解决方案 > 不从资源创建时无法选择 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<*>?, view: View?, position: Int, id: Long) {
                val item = parent?.getItemAtPosition(position).toString()
                Toast.makeText(parent?.context, "Selected: $item", 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(",")
            modules.add(Module(values[0].replace("\uFEFF", "").toInt(), values[1], values[2].replace("\uFEFF", "").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<*>?, 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)
                    }
                }

                ArrayAdapter(
                    applicationContext,
                    R.layout.custom_spinner,
                    moduleCodeArray
                ).also { adapter ->
                    adapter.setDropDownViewResource(R.layout.custom_spinner_dropdown)
                    moduleCodeSpinner.adapter = adapter
                }
            }
            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
        }

        moduleCodeSpinner.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()
            }

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

标签: androidkotlinspinner

解决方案


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

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

这就是我所做的: 微调器示例


推荐阅读