ArrayList<ArrayList<String>> в объекте Parcelable 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 Experiment 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) {
    // ?????
  }

}

используйте сериализуемый для решения этой сложности.

sushildlh 08.03.2019 06:32
2
1
2 723
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете напрямую создать Parcelable для List из List, поэтому одно из решений состоит в том, чтобы сделать один подкласс желаемого List как Parcelable и использовать его в качестве окончательного типа списка. Как? посмотрите ниже :

Давайте сначала создадим наш внутренний класс List of 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)
       }
    }
}

Примечание. Это простая реализация на основе О.П., вы можете выполнить любую настройку в соответствии с вашими требованиями.

Другие вопросы по теме