web-dev-qa-db-ja.com

KotlinパーセルとパーセルのarrayList

AndroidアプリケーションでactivityAからactivityBに渡すパーセル可能なデータオブジェクトを書き込もうとしています。

私のオブジェクトは、Available Serviceクラスのarraylistを除くすべてのデータを渡しています

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です。次に、arraylistAvailableServiceを保持するTripがあります。デバッグでこれを観察しましたが、何らかの理由でデータの読み取りに問題があるため、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
}

誰かがCREATORの楽しさを知りたい場合は、以下のコード:

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を読み書きする別の方法はありますか?私はそれを間違って書いていますか?間違って読んでいる?

助けてくれてありがとう!

16
JozeRi

交換:

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

で:

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

変化する

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