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
相关产品推荐
相关产品推荐

