gpt4 book ai didi

android - Kotlin parcelable 和 arrayList of parcelables

转载 作者:IT老高 更新时间:2023-10-28 13:31:28 28 4
gpt4 key购买 nike

我正在尝试编写一个可打包的数据对象,以便在我的 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,它保存了一个AvailableServicearraylist。我在调试中观察到这一点,它正在成功写入 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?我写错了吗?读错了吗?

提前感谢您的帮助!

最佳答案

替换:

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

与:

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

关于android - Kotlin parcelable 和 arrayList of parcelables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45459273/

28 4 0