2017-08-02 114 views
4

我想写一个parcelable数据对象从activityAactivityB在我的android应用程序中传递。Kotlin parcelable和arrayList of parcelables

我的目的是通过与所有的数据,除了我的类可用服务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,接下来我有旅行,其持有的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 
} 

万一有人想知道什么是造物主的乐趣呢,下面的代码:

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?我写错了吗?读错了?

在此先感谢您的帮助!

回答

7

替换:

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

有:

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

变化

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) 
    } 
} 
相关问题