web-dev-qa-db-fra.com

Kotlin parcelable and arrayList of parcelables

J'essaie d'écrire un objet de données parcelable pour passer de activityA à activityB dans mon Android Android.

Mon objet passe avec toutes les données, sauf mon arraylist de la classe Available Service

data class AvailableService(val id: Int,
                        val name: String,
                        val description: String,
                        val price: Double,
                        val currency: String,
                        val imageUrl: String) : Parcelable {

companion object {
    @JvmField @Suppress("unused")
    val CREATOR = createParcel { AvailableService(it) }
}

protected constructor(parcelIn: Parcel) : this(parcelIn.readInt(),
        parcelIn.readString(),
        parcelIn.readString(),
        parcelIn.readDouble(),
        parcelIn.readString(),
        parcelIn.readString())

override fun writeToParcel(dest: Parcel?, flags: Int) {
    dest?.writeInt(id)
    dest?.writeString(name)
    dest?.writeString(description)
    dest?.writeDouble(price)
    dest?.writeString(currency)
    dest?.writeString(imageUrl)
}

override fun describeContents() = 0
}

ci-dessus est le serviceClass disponible, ensuite j'ai Trip, qui contient un arraylist de AvailableService .. J'ai observé cela dans le débogage, il écrit avec succès le arraylist, pour une raison quelconque, j'ai un problème avec la lecture des données.

data class Trip(val id: String,
            val status: String,
            val orderedServices: ArrayList<OrderedService>) : Parcelable {

companion object {
    @JvmField @Suppress("unused")
    val CREATOR = createParcel { Trip(it) }
}

protected constructor(parcelIn: Parcel) : this(parcelIn.readString(),
        parcelIn.readString(),
        arrayListOf<OrderedService>().apply {
            parcelIn.readArrayList(OrderedService::class.Java.classLoader)
        }
)

override fun writeToParcel(dest: Parcel?, flags: Int) {
    dest?.writeString(id)
    dest?.writeString(status)
    dest?.writeList(orderedServices)
}

override fun describeContents() = 0
}

au cas où quelqu'un se demanderait à quoi sert le CREATOR, codez ci-dessous:

inline fun <reified T : Parcelable> createParcel(
    crossinline createFromParcel: (Parcel) -> T?): Parcelable.Creator<T> =
    object : Parcelable.Creator<T> {
        override fun createFromParcel(source: Parcel): T? = createFromParcel(source)
        override fun newArray(size: Int): Array<out T?> = arrayOfNulls(size)
    }

encore une fois, l'écriture réussit, mais la lecture échoue, j'obtiens un arraylist .. vide. Je pense que cette partie est défectueuse:

arrayListOf<OrderedService>().apply {
        parcelIn.readArrayList(OrderedService::class.Java.classLoader)
    }

existe-t-il une manière différente de lire/écrire arraylist? suis-je en train de l'écrire mal? mal lu?

merci d'avance pour votre aide!

16
JozeRi

Remplacer:

arrayListOf<OrderedService>().apply {
    parcelIn.readArrayList(OrderedService::class.Java.classLoader)
}

avec:

arrayListOf<OrderedService>().apply {
    parcelIn.readList(this, OrderedService::class.Java.classLoader)
}
32
Lid

Changement

arrayListOf<OrderedService>().apply {
    parcelIn.readArrayList(OrderedService::class.Java.classLoader)
}

à

source.createTypedArrayList(OrderedService.CREATOR)

Modifier dest?.writeList(orderedServices)

à dest?.writeTypedList(orderedServices)

La méthode du créateur

    companion object {
    @JvmField
    val CREATOR: Parcelable.Creator<Trip> = object : Parcelable.Creator<Trip> {
        override fun createFromParcel(source: Parcel): Trip = Trip(source)
        override fun newArray(size: Int): Array<Trip?> = arrayOfNulls(size)
    }
}
5
Ronaldo Albertini