Kotlin parcelable и arrayList parcelables



Я пытаюсь написать parcelable объект данных для передачи от activityA к activityB в моем приложении для android.



Мой объект передается со всеми данными, кроме моих arraylist класса 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
}


Выше есть доступный serviceClass, Далее у меня есть трип, который содержит arraylist из AvailableService.. Я наблюдал это в debug, он успешно пишет arraylist, по какой-то причине у меня есть проблема с чтением данных.



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
}


В случае, если кто-то задается вопросом, что это за забава Творца, код ниже:



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


Опять же, написание удается, но чтение не удается, я получаю пустой arraylist..
Я думаю, что эта часть неисправна:



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


Есть ли другой способ чтения / записи arraylist? я что, неправильно пишу? читаешь неправильно?

Заранее спасибо за любую помощь!

738   2  

2 ответов:

Заменить:

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

С:

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

Изменение

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

К

source.createTypedArrayList(OrderedService.CREATOR)

Изменение dest?.writeList(orderedServices)

К dest?.writeTypedList(orderedServices)

Метод Творца

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

Comments

    Ничего не найдено.