[英]ArrayList<ArrayList<String>> in Parcelable object kotlin
需要對字符串數組的數組進行分塊。 對象是這樣的
data class Foo (
@SerializedName("bar") val bar: ArrayList<ArrayList<String>>,
)
它並不完全需要是 ArrayList。 也可以使用數組。
data class Foo (
@SerializedName("bar") val bar: Array<Array<String>>,
)
哪個更容易映射這個json數據
{
"bar": [
["a", "b"],
["a1", "b2", "c2"],
["a3", "b34", "c432"]
]
}
使用 kotlin 實驗性Parcelize
在使用 progaurd 編譯時會導致應用程序崩潰
它是如何在“writeToParcel”中寫入並在“構造函數”中讀取的?
data class Foo (
@SerializedName("bar") val bar: ArrayList<ArrayList<String>>,
) : Parcelable {
constructor(source: Parcel) : this(
// ?????
)
override fun writeToParcel(dest: Parcel, flags: Int) = with(dest) {
// ?????
}
}
您不能直接為List
of List
直接創建Parcelable
,因此一種解決方案是將所需List
一個子類設為Parcelable
並將其作為最終列表類型。 如何? 看看下面:
讓我們首先創建我們的內部 String 類列表,如下所示:
class StringList() : ArrayList<String>(), Parcelable {
constructor(source: Parcel) : this() {
source.createStringArrayList()
}
override fun describeContents() = 0
override fun writeToParcel(dest: Parcel, flags: Int) {
dest.writeStringList(this@StringList)
}
companion object {
@JvmField
val CREATOR: Parcelable.Creator<StringList> = object : Parcelable.Creator<StringList> {
override fun createFromParcel(source: Parcel): StringList = StringList(source)
override fun newArray(size: Int): Array<StringList?> = arrayOfNulls(size)
}
}
}
我們在這里所做的是創建了我們的ArrayList<String>
可分塊,以便我們可以在任何端點使用它。
所以最終的數據類將具有以下實現:
data class Foo(@SerializedName("bar") val bar: List<StringList>) : Parcelable {
constructor(source: Parcel) : this(
source.createTypedArrayList(StringList.CREATOR)
)
override fun describeContents() = 0
override fun writeToParcel(dest: Parcel, flags: Int) = with(dest) {
writeTypedList(bar)
}
companion object {
@JvmField
val CREATOR: Parcelable.Creator<Foo> = object : Parcelable.Creator<Foo> {
override fun createFromParcel(source: Parcel): Foo = Foo(source)
override fun newArray(size: Int): Array<Foo?> = arrayOfNulls(size)
}
}
}
注意:這是基於OP的簡單實現,您可以根據您的要求進行任何自定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.