Kotlin parcelable 和 arrayList of parcelables

新手上路,请多包涵

我正在尝试编写一个 parcelable 数据对象以在我的 android 应用程序中从 activityA 传递到 activityB

我的对象正在传递所有数据,除了我的可用服务类的 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 ,接下来我有 Trip,它拥有一个 arraylistAvailableService 我在调试中观察到这个成功了 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 ?我写错了吗?读错了吗?

在此先感谢您的帮助!

原文由 JozeRi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 625
2 个回答

代替:

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

和:

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

原文由 Lid 发布,翻译遵循 CC BY-SA 3.0 许可协议

改变

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

原文由 Ronaldo Albertini 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题