как реализовать parcelable для ArrayList Mutable Map? - PullRequest
0 голосов
/ 19 января 2020

У меня есть свойство в моем классе, что тип данных ArrayList<MutableMap<String,Any>>, но я не совсем понимаю, что мне писать в конструкторе участков, а также в методе 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 нормально

1 Ответ

0 голосов
/ 19 января 2020

Как уже упоминалось Мохаммед Алаа , в Kotlin вы можете использовать аннотацию @ 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

Если вы используйте любой класс, этот подход не будет работать. В этом случае вы можете go перейти с любого на класс, поддерживаемый Parcelize, или написать код самостоятельно. Как то так:

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
        }
    }
}
...