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

Android Kotlin如何将自定义数据类集合传递到其他Activity

问题原因

你当前直接调用toString()传递对象,本质传递的是对象的字符序列化描述,并非结构化数据,无法反向解析为原本的对象实例。Android 平台推荐使用 Parcelable 实现自定义类的跨组件传递,性能远高于 Java 原生的 Serializable。

实现步骤

1. 添加Parcelize插件依赖

在你的模块级build.gradle(对应.kts配置则调整对应语法)中添加插件声明:

plugins {
    // 保留其他已有插件
    id 'kotlin-parcelize'
}

同步Gradle配置后生效。

2. 给所有自定义数据类实现Parcelable

修改你的data class代码,添加@Parcelize注解并继承Parcelable接口:

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

@Parcelize
data class PlayerPerformance(
    val name: String, 
    val value: Int, 
    val key: String
) : Parcelable

@Parcelize
data class LegendWrapper(
    val data: List<PlayerPerformance>? = emptyList()
) : Parcelable

@Parcelize
data class TestList(
    val name: String, 
    val data: LegendWrapper
) : Parcelable

3. 修改Intent传递逻辑

不要调用toString(),直接传递Parcelable对象:

heroesAdapt = HeroesRecyclerAdapter(this, recList) { testList ->
    val heroesStatsActivity = Intent(this, HeroesStatsActivity::class.java)
    heroesStatsActivity.putExtra("nicknameHeroes", testList.name)
    // 直接传递Parcelable对象,也可根据需求直接传整个testList对象
    heroesStatsActivity.putExtra("legend_data", testList.data)
    startActivity(heroesStatsActivity)
}

4. 目标Activity接收数据

在HeroesStatsActivity的onCreate方法中解析数据:

// 兼容不同Android版本的读取写法
val legendData = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    intent.getParcelableExtra("legend_data", LegendWrapper::class.java)
} else {
    @Suppress("DEPRECATION")
    intent.getParcelableExtra<LegendWrapper>("legend_data")
}
val nickname = intent.getStringExtra("nicknameHeroes")

// 拿到后即可直接调用属性操作,比如遍历data列表
legendData?.data?.forEach { player ->
    // 直接处理player的name、value等属性即可
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:39:03