Kotlin实现字符串ListView无法更新按钮文本及ArrayAdapter适配问题咨询
问题排查与解决方案
问题1:ArrayAdapter编译时报入参类型不匹配
原因
ArrayAdapter默认构造的第二个入参要求是仅包含单个TextView的布局文件,如果你定义的R.layout.deviceButton根布局不是TextView,或者内部包含多个控件,就会出现类型不匹配。- 如果代码写在Fragment中,直接传
this作为上下文不符合入参要求,需要传入Fragment关联的Context。 - 你当前定义的
deviceNames是固定长度为6的数组,如果API返回的设备数量超过6会触发数组越界,同时如果自定义布局带其他控件,没有指定布局内TextView的id也会报错。 - 你循环里的
println(deviceNames[I])使用了大写的I作为索引,不符合Kotlin语法,会直接编译报错。
解决方法
- 调整
deviceNames为可变集合,避免固定长度的问题:
val deviceNames = mutableListOf<String>() for (i in 0 until jsonArray.length()) { val device = jsonArray.getJSONObject(i) val name = device.getString("name") // 推荐用getString而非强转 deviceNames.add(name) println(deviceNames[i]) // 把大写I改成小写i }
- 调整ArrayAdapter初始化逻辑:
如果只是测试可先用系统默认布局验证:
// Activity中用this,Fragment中替换为requireContext() val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, deviceNames)
如果一定要用自定义的R.layout.deviceButton布局,需要额外传入布局内展示文字的TextView的id:
// 第三个参数替换为你deviceButton布局内TextView的实际id val adapter = ArrayAdapter(this, R.layout.deviceButton, R.id.device_text, deviceNames)
问题2:无法找到id为deviceButton的控件
原因
deviceButton是ListView子项的内部控件,不属于Activity/Fragment的根布局,你直接在Activity中调用findViewById(R.id.deviceButton)是找不到的,只能在子项渲染的逻辑中获取。
解决方法
如果需要给子项的按钮设置点击事件,需要重写ArrayAdapter的getView方法,在子项渲染时获取控件:
val adapter = object : ArrayAdapter<String>(this, R.layout.deviceButton, deviceNames) { override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { val view = convertView ?: layoutInflater.inflate(R.layout.deviceButton, parent, false) // 这里才能获取子项内的按钮 val deviceBtn = view.findViewById<Button>(R.id.deviceButton) val deviceName = getItem(position) ?: "" // 设置按钮文字/点击事件 deviceBtn.text = deviceName deviceBtn.setOnClickListener { // 处理按钮点击逻辑 } return view } } listView.adapter = adapter
内容的提问来源于stack exchange,提问作者Sacooley1
相关产品推荐
相关产品推荐

