问题描述
我正在使用 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