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!
Remplacer:
arrayListOf<OrderedService>().apply {
parcelIn.readArrayList(OrderedService::class.Java.classLoader)
}
avec:
arrayListOf<OrderedService>().apply {
parcelIn.readList(this, OrderedService::class.Java.classLoader)
}
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)
}
}