Android Kotlin如何在Activity之间传递自定义类型的MutableList或ArrayList
解决方案
问题根源
- 第一次报错是因为你调用了
putStringArrayListExtra(),这个API只能接收元素为String类型的列表,你传入的是Memes类型列表,自然类型不匹配 - 第二次尝试运行报错的核心原因是你的
Memes自定义类没有实现Android推荐的Parcelable序列化接口,Intent无法直接序列化传递自定义类型的对象
落地实现步骤
步骤1:添加kotlin-parcelize插件支持
在你的App模块级build.gradle.kts(或者groovy版本的build.gradle)的plugins块中添加插件:
// 如果是kts格式 plugins { id("com.android.application") id("org.jetbrains.kotlin.android") // 新增这一行 id("kotlin-parcelize") }
如果是groovy格式:
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' // 新增这一行 id 'kotlin-parcelize' }
添加后同步Gradle即可。
步骤2:修改Memes类实现Parcelable接口
直接用@Parcelize注解自动生成序列化逻辑,修改后的代码如下:
import android.os.Parcelable import com.google.gson.annotations.SerializedName import kotlinx.parcelize.Parcelize @Parcelize class Memes ( @SerializedName("id") var id: Long, @SerializedName("title") var title: String ) : Parcelable
步骤3:Activity A中传递数据
推荐用Parcelable列表的专属API传递,代码更清晰:
val extras = Bundle() extras.putString("gal", "animals") extras.putString("query", "") val i = Intent(context, GalleryShow::class.java) // 把MutableList转成ArrayList<Memes>传入 i.putParcelableArrayListExtra("list", ArrayList(memes)) i.putExtras(extras) (context as Activity).startActivityForResult(i, 777)
步骤4:Activity B中接收数据
用空安全的方式接收,避免空指针崩溃:
private lateinit var memes: MutableList<Memes> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_gallery_show) // 接收Parcelable列表,取不到的话默认赋值为空可变列表,避免崩溃 memes = intent?.getParcelableArrayListExtra<Memes>("list")?.toMutableList() ?: mutableListOf() // 你的其他参数接收也可以直接从intent取,不需要走extras,更简洁 val gal = intent?.getStringExtra("gal") ?: "" val query = intent?.getStringExtra("query") ?: "" }
内容的提问来源于stack exchange,提问作者TheGreatCornholio
相关产品推荐
相关产品推荐

