首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >parcelable的Kotlin parcelable和arrayList

parcelable的Kotlin parcelable和arrayList
EN

Stack Overflow用户
提问于 2017-08-02 11:12:43
回答 4查看 27.7K关注 0票数 23

我试图在我的安卓应用程序中编写一个可打包的数据对象,以便从activityA传递到activityB

我的对象正在传递所有数据,除了可用服务类的arraylist

代码语言:javascript
运行
复制
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,next I‘s Trip,它持有arraylist of AvailableService.我在调试中观察到了这一点,它正在成功地编写arraylist,出于某种原因,我在读取数据时遇到了问题。

代码语言:javascript
运行
复制
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
}

如果有人想知道创建者的乐趣是什么,请编写如下代码:

代码语言:javascript
运行
复制
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。我认为那部分是错误的:

代码语言:javascript
运行
复制
arrayListOf<OrderedService>().apply {
        parcelIn.readArrayList(OrderedService::class.java.classLoader)
    }

读/写arraylist有不同的方式吗?我写错了吗?看错了吗?

提前感谢您的帮助!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-08-02 11:31:08

取代:

代码语言:javascript
运行
复制
arrayListOf<OrderedService>().apply {
    parcelIn.readArrayList(OrderedService::class.java.classLoader)
}

通过以下方式:

代码语言:javascript
运行
复制
arrayListOf<OrderedService>().apply {
    parcelIn.readList(this, OrderedService::class.java.classLoader)
}
票数 42
EN

Stack Overflow用户

发布于 2018-02-16 17:55:05

变化

代码语言:javascript
运行
复制
arrayListOf<OrderedService>().apply {
    parcelIn.readArrayList(OrderedService::class.java.classLoader)
}

代码语言:javascript
运行
复制
source.createTypedArrayList(OrderedService.CREATOR)

改变dest?.writeList(orderedServices)

转到dest?.writeTypedList(orderedServices)

创建者方法

代码语言:javascript
运行
复制
    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)
    }
}
票数 7
EN

Stack Overflow用户

发布于 2019-10-31 00:33:11

For API 29及以上

取代:

代码语言:javascript
运行
复制
arrayListOf<OrderedService>().apply {
    parcelIn.readArrayList(OrderedService::class.java.classLoader)
}

使用

代码语言:javascript
运行
复制
if (Build.VERSION.SDK_INT >= 29)
    parcel.readParcelableList(this, OrderedService::class.java.classLoader)
else
    parcel.readList(this as List<OrderedService>, OrderedService::class.java.classLoader)
}

代码语言:javascript
运行
复制
override fun writeToParcel(dest: Parcel?, flags: Int) {
    dest?.writeString(id)
    dest?.writeString(status)
    dest?.writeList(orderedServices)
}

使用

代码语言:javascript
运行
复制
override fun writeToParcel(dest: Parcel?, flags: Int) {
    dest?.writeString(id)
    dest?.writeString(status)
    if (Build.VERSION.SDK_INT >= 29) {
        dest?.writeParcelableList(orderedServices,flags)
    } else {
        dest?.writeList(orderedServices as List<OrderedService>)
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45459273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档