Kotlin:Intent传递ArrayList后无法适配ListView的问题
问题解决:Intent传递ArrayList后在ListView正确展示
错误原因分析
- 获取方式错误:你传递的是
ArrayList<String>,但使用了getStringArrayExtra(),这个方法仅用于获取String[]类型数据,无法正确读取ArrayList。 - 类型转换错误:调用
.toString()会把ArrayList转换成描述性字符串(比如[item1, item2]),而非保留集合类型,导致ArrayAdapter无法识别为有效数据源。 - 冗余循环:在循环中重复创建并设置Adapter完全没必要,只需初始化一次即可完成绑定。
正确实现步骤
1. 目标Activity中正确获取ArrayList
直接使用getStringArrayListExtra()方法接收,它专门适配ArrayList<String>类型的Intent数据:
val qrResultList = intent.getStringArrayListExtra("qrResultList") ?: arrayListOf()
注:
?: arrayListOf()是为空兜底处理,避免Intent无数据时触发空指针异常。
如果需要兼容更通用的序列化场景,也可以用getSerializableExtra()强转:
val qrResultList = intent.getSerializableExtra("qrResultList") as? ArrayList<String> ?: arrayListOf()
2. 初始化Adapter并绑定ListView
无需循环,直接将ArrayList作为数据源传入ArrayAdapter,再绑定到ListView:
// 创建ArrayAdapter val arrayAdapter = ArrayAdapter( this, android.R.layout.simple_list_item_1, qrResultList ) // 绑定到ListView qrlistview.adapter = arrayAdapter // 设置列表项点击事件 qrlistview.setOnItemClickListener { _, _, position, _ -> val selectedItem = qrResultList[position] Toast.makeText(this, "Item Selected $selectedItem", Toast.LENGTH_LONG).show() }
完整目标Activity代码示例
class QRSessionFullList : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_qr_session_full_list) // 获取传递的ArrayList val qrResultList = intent.getStringArrayListExtra("qrResultList") ?: arrayListOf() // 初始化Adapter并绑定ListView val arrayAdapter = ArrayAdapter( this, android.R.layout.simple_list_item_1, qrResultList ) qrlistview.adapter = arrayAdapter // 设置列表项点击事件 qrlistview.setOnItemClickListener { _, _, position, _ -> Toast.makeText(this, "Item Selected ${qrResultList[position]}", Toast.LENGTH_LONG).show() } } }
额外说明
- MainActivity中的传递代码无需修改,因为
ArrayList<String>实现了Serializable接口,Intent可直接传递这类可序列化集合。 - 确保布局文件中ListView的id为
qrlistview,否则会出现控件找不到的异常。
内容的提问来源于stack exchange,提问作者Milkova Fitzgerald
相关产品推荐
相关产品推荐

