You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中通过Intent传递自定义对象数组并转为ArrayList

解决Android中传递自定义对象数组并转为ArrayList的问题

我来帮你搞定这个Android页面间传递自定义对象数组的问题,你的代码目前有两个核心问题需要修正:一是自定义的Attachment类没有实现序列化接口(Android的Intent无法直接传递未序列化的对象);二是ActivityB里还没完成接收和转换的逻辑。咱们一步步来解决:

1. 让自定义数据类实现序列化接口

Android中传递对象必须让对象实现Parcelable或Serializable接口,推荐用Parcelable(Android专属,性能比Serializable高很多),两种方式的实现如下:

方式一:Parcelable(推荐)

使用Kotlin的@Parcelize注解可以自动生成Parcelable的实现代码,非常省心:

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class Attachment(val Name: String, val Content: String) : Parcelable

注意:要使用这个注解,需要在模块级别的build.gradle中添加kotlin-parcelize插件:

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-parcelize' // 新增这一行
}

方式二:Serializable(简单通用)

如果追求简单,也可以实现Serializable接口,代码更短,但性能不如Parcelable:

import java.io.Serializable

data class Attachment(val Name: String, val Content: String) : Serializable

2. 修改ActivityA的传递逻辑

首先要确保ActivityA继承AppCompatActivity(否则无法使用Intent相关方法),然后补充启动Activity的代码:

class ActivityA : AppCompatActivity() {
    // 示例数据,你可以换成自己的数组
    private var attachments: Array<Attachment> = arrayOf(
        Attachment("文件1", "内容1"),
        Attachment("文件2", "内容2")
    )

    fun callB() {
        val intent = Intent(this, ActivityB::class.java).apply {
            // 如果用Parcelable,用putParcelableArrayExtra传递数组
            putParcelableArrayExtra("Attachments", attachments)
            // 如果用Serializable,换成下面这行:
            // putSerializableExtra("Attachments", attachments)
        }
        startActivity(intent) // 别忘了启动ActivityB
    }
}

3. 在ActivityB中接收并转为ArrayList

同样要让ActivityB继承AppCompatActivity,然后在onCreate方法中接收数据并转换:

class ActivityB : AppCompatActivity() {
    private lateinit var attachmentsList: ArrayList<Attachment>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_b)

        // 接收数据,根据你用的序列化方式选择对应方法
        val attachmentsArray = intent.getParcelableArrayExtra<Attachment>("Attachments")
        // 如果用Serializable,换成下面这行:
        // val attachmentsArray = intent.getSerializableExtra("Attachments") as? Array<Attachment>

        attachmentsArray?.let {
            // 将数组转换为可修改的ArrayList
            attachmentsList = ArrayList(it.asList())
            // 这里可以添加你的业务逻辑,比如遍历数据
            for (attachment in attachmentsList) {
                println("文件名:${attachment.Name},内容:${attachment.Content}")
            }
        } ?: run {
            // 处理未接收到数据的异常情况
            println("未接收到附件数据")
        }
    }
}

补充说明

  • it.asList()返回的是一个固定大小的列表,用ArrayList()包装后就变成了可添加/删除元素的ArrayList;
  • 传递数据时的key(这里是"Attachments")要和接收时的key完全一致,否则会接收不到数据;
  • 如果你的数组可能为空,一定要做非空判断,避免空指针异常。

内容的提问来源于stack exchange,提问作者Sankar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:00:20