基本上,我从主活动类创建了一个 arrayList,如下所示:
val qrResultList = ArrayList<String>()
现在,当我按下按钮时,它将在数组列表中添加一个值:
qrResultList.add(textResult.value)
现在,我想按另一个按钮,实际上将 qrResultList 作为完整的数组列表变量。
val intent = Intent (this@MainActivity, QRSessionFullList::class.java)
intent.putExtra("qrResultList", qrResultList) // push the whole qr result list to be hauled by the next activity.
startActivity(intent) // pushes the event to the qr list
现在,我想将它显示在列表视图之类的东西中,然后创建一个 for 循环来访问它:
val qrResultList = intent.getStringArrayExtra("qrResultList").toString() // coverts to array
for (item in qrResultList) {
val arrayAdapter:ArrayAdapter<String> = ArrayAdapter(
this, android.R.layout.simple_list_item_1,
qrResultList
)
qrlistview.adapter = arrayAdapter
qrlistview.setOnItemClickListener {
adapterView, view, i, l -> Toast.makeText(this, "Item Selected " + qrResultList[i],
Toast.LENGTH_LONG).show()
}
}
但它表示无法使用提供的事件调用 ArrayAdapter。有没有办法可以分配值,因为这部分:
val arrayAdapter:ArrayAdapter<String> = ArrayAdapter(
this, android.R.layout.simple_list_item_1,
qrResultList
)
它不接受 qrResultList 作为数组:(
当您使用
intent.putExtra()
而不是 intent.putStringArrayListExtra()
时,您正在将 ArrayList 编码为可序列化。
当您检索额外的内容时,您需要检索您用于输入的相同类型,因为它必须知道如何从输入时的编码方式对其进行解码。因此在这种情况下,您可以使用
getSerializableExtra("qrResultList") as ArrayList<String>
检索它
,但这是一种混乱的方式。
更简洁的方法是使用
intent.putStringArrayListExtra(qrResultList)
,然后使用 getStringArrayListExtra()
检索它。请注意与 getStringArrayExtra()
的区别。 ArrayList 和 Array 是两个不同的东西!
正如 @dominicoder 在评论中提到的,您也不能在结果上使用
toString()
。这会将您的列表(如果您未能更正上述内容,则为 null)转换为字符串,无法用于您的 ArrayAdapter。
由于返回的列表可能可为空,因此请将适配器创建代码包装在
if (qrResultList != null) { }
中,或者,您可以对其调用 orEmpty()
将其转换为不可为空。
旁注:在迭代列表的 for 循环中创建 ArrayAdapter 是没有意义的。如果列表有 10 个项目,那么您将创建 ArrayAdapter 10 次并丢弃前 9 个冗余副本。
val qrResultList = intent.getStringArrayListExtra("qrResultList").orEmpty()
val arrayAdapter:ArrayAdapter<String> = ArrayAdapter(
this, android.R.layout.simple_list_item_1,
qrResultList
)
qrlistview.adapter = arrayAdapter
//...