使数组变量可作为 Kotlin 中的数组从意图传递到另一个活动

问题描述 投票:0回答:1

基本上,我从主活动类创建了一个 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 作为数组:(

arrays kotlin arraylist
1个回答
0
投票

当您使用

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
//...
© www.soinside.com 2019 - 2024. All rights reserved.