【问题标题】:ArrayList<ArrayList<String>> in Parcelable object kotlinParcelable 对象中的 ArrayList<ArrayList<String>>
【发布时间】:2019-07-30 02:49:25
【问题描述】:

字符串数组的数组需要被打包。对象是这样的

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 Experimental Parcelize 在使用 progaurd 编译应用时会导致应用崩溃

在“writeToParcel”中如何写入,在“constructor”中如何读取?

data class Foo (
  @SerializedName("bar") val bar: ArrayList<ArrayList<String>>,
) : Parcelable {

  constructor(source: Parcel) : this(
     // ?????
  )

  override fun writeToParcel(dest: Parcel, flags: Int) = with(dest) {
    // ?????
  }

}

【问题讨论】:

  • 使用可序列化来解决这种复杂性。

标签: android arrays arraylist kotlin parcelable


【解决方案1】:

您不能直接为ListList 直接创建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&lt;String&gt; parcelable,以便我们可以在任何端点使用它。

因此最终数据类将具有以下实现:

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

注意:这是基于O.P.的简单实现,您可以根据自己的要求进行任何自定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 2016-06-14
    • 1970-01-01
    相关资源
    最近更新 更多