簡體   English   中英

數組列表<ArrayList<String> &gt; 在 Parcelable 對象 kotlin 中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM