ArrayListв товарный объект котлин - PullRequest
2 голосов
/ 08 марта 2019

Массив строк должен быть разбит на части. Объект похож на

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) {
    // ?????
  }

}

1 Ответ

1 голос
/ 08 марта 2019

Вы не можете напрямую создать 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)
       }
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...