2017-08-02 16 views
4

私はアンドロイドアプリケーションでアクティビティAからアクティビティBに渡すパーセル可能なデータオブジェクトを書き込もうとしています。パーセルブルのパーセル化可能なarrayListのリスト

私の目的は、上記の私のクラス利用可能なサービスの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 
} 

私はAvailableServicearraylistを保持トリップを持って次の、利用可能serviceClassある以外、すべてのデータを渡している..私はこれを観察デバッグでは、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の楽し何不思議場合に行い、以下のコード:私は空のarraylistを取得し、

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

は再び、書き込みが成功しますが、読み取りに失敗した... 私はその部分を考えます故障したものです:

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) 

Cへハンゲ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) 
    } 
} 
関連する問題