如何为包含自定义对象ArrayList的类添加Parcelable实现?
你遇到的报错是两个问题共同导致的:
writeToParcel方法中没有写入products字段,且字段读写顺序不匹配- 构造函数中没有正确实现
products字段的读取逻辑
修正步骤
1. 修正writeToParcel方法
在写入user_id之后、addressId之前,加入products的写入逻辑,保证和构造函数的读取顺序完全一致:
override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeString(id) parcel.writeString(user_id) // 新增写入products列表 parcel.writeTypedList(products) parcel.writeString(addressId) parcel.writeString(image) parcel.writeString(title) parcel.writeString(subTotal) parcel.writeString(shippingCharge) parcel.writeString(total) }
2. 修正构造函数中的products读取逻辑
用createTypedArrayList方法直接读取Cart类型的ArrayList,替换原来的TODO:
constructor(parcel: Parcel) : this( parcel.readString().toString(), parcel.readString().toString(), // 替换TODO为如下代码 parcel.createTypedArrayList(Cart.CREATOR) ?: arrayListOf(), parcel.readString().toString(), parcel.readString().toString(), parcel.readString().toString(), parcel.readString().toString(), parcel.readString().toString(), parcel.readString().toString() )
注意:请确保你的Cart类已经正确实现Parcelable接口,且包含名为CREATOR的伴生对象实现。
完整修正后代码
class Orders ( var id:String="", var user_id:String="", var products: ArrayList<Cart> = arrayListOf(), var addressId:String="", val image:String="", val title:String="", val subTotal:String="", val shippingCharge:String="", val total:String="", ) : Parcelable { constructor(parcel: Parcel) : this( parcel.readString().toString(), parcel.readString().toString(), parcel.createTypedArrayList(Cart.CREATOR) ?: arrayListOf(), parcel.readString().toString(), parcel.readString().toString(), parcel.readString().toString(), parcel.readString().toString(), parcel.readString().toString(), parcel.readString().toString() ) override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeString(id) parcel.writeString(user_id) parcel.writeTypedList(products) parcel.writeString(addressId) parcel.writeString(image) parcel.writeString(title) parcel.writeString(subTotal) parcel.writeString(shippingCharge) parcel.writeString(total) } override fun describeContents(): Int { return 0 } companion object CREATOR : Parcelable.Creator<Orders> { override fun createFromParcel(parcel: Parcel): Orders { return Orders(parcel) } override fun newArray(size: Int): Array<Orders?> { return arrayOfNulls(size) } } }
内容的提问来源于stack exchange,提问作者Sarthak Kumar
相关产品推荐
相关产品推荐

