Mutable Map的ArrayList如何实现parcelable?

how to implement parcelable to ArrayList of Mutable Map?

我的 class 中有这个 属性 数据类型是 ArrayList<MutableMap<String,Any>> ,但我很困惑我应该在 parcel 构造函数和 writeToParcel 中写什么方法 ?

class User() : Parcelable {
     var uid : String = ""
     var upcomingEvents : ArrayList<MutableMap<String,Any>> = ArrayList()

  constructor(parcel: Parcel) : this() {
     uid = parcel.readString() ?: ""
     upcomingEvents = ....... // <-- what should I write in here ?

  }   

  override fun writeToParcel(parcel: Parcel, flags: Int) {
     parcel.writeString(uid)
     parcel........ // <--- and also here ???

  }

java或者kotlin都可以

作为 Mohammed Alaa already mentioned, in Kotlin you can use the @Parcelize 自动生成所有代码的注释:

import android.os.Parcel
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize

@Parcelize
data class User(var uid: String, var upcomingEvents: List<MutableMap<String, Any>>) :
    Parcelable

如果您使用 Any class,此方法将不起作用。在这种情况下,您可以将 Any 更改为 Parcelize 支持的 class 或自己编写代码。像这样:

data class User(var uid: String, var upcomingEvents: List<MutableMap<String, Any>>) :
    Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString() ?: "",
        readUpcomingEvents(parcel)
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(uid)
        parcel.writeList(upcomingEvents)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<User> {
        override fun createFromParcel(parcel: Parcel): User {
            return User(parcel)
        }

        override fun newArray(size: Int): Array<User?> {
            return arrayOfNulls(size)
        }

        private fun readUpcomingEvents(parcel: Parcel): List<MutableMap<String, Any>> {
            val list = mutableListOf<MutableMap<String, Any>>()
            parcel.readList(list as List<*>, MutableMap::class.java.classLoader)

            return list
        }
    }
}