Как отправить List‹Int› с kotlin

Я хочу передать класс данных (который содержит список int в качестве свойства) другому действию через Bundle, и поэтому мне нужно добавить реализацию Parcelable в мой класс данных. Любая идея о том, как разделить это имущество?

data class Test(val id: Long, val files: List<Int>?) : Parcelable {

constructor(parcel: Parcel) : this(
        parcel.readLong(),
        TODO("files"))

override fun writeToParcel(parcel: Parcel, flags: Int) {
    parcel.writeLong(id)
}

override fun describeContents(): Int {
    return 0
}

companion object CREATOR : Parcelable.Creator<Test> {
    override fun createFromParcel(parcel: Parcel): Test {
        return Test(parcel)
    }

    override fun newArray(size: Int): Array<Test?> {
        return arrayOfNulls(size)
    }
}

person Mohammad Zare    schedule 21.01.2018    source источник


Ответы (2)


Вы можете написать список целых чисел как int[]:

parcel.writeIntArray(files.toIntArray())

Убедитесь, что вы используете ту же структуру данных при обратном чтении:

files = parcel.createIntArray().toList()

Вы можете сделать его более эффективным, используя функции расширения, пропустив представление массива:

parcel.writeIntList(files)
files = parcel.createIntList()

fun Parcel.writeIntList(input:List<Int>) {
    writeInt(input.size) // Save number of elements.
    input.forEach(this::writeInt) // Save each element.
}

fun Parcel.createIntList() : List<Int> {
    val size = readInt()
    val output = ArrayList<Int>(size)
    for (i in 0 until size) {
        output.add(readInt())
    }
    return output
}
person Eugen Pechanec    schedule 21.01.2018
comment
Привет, у меня такая же проблема, я следовал вашему пути, но все еще получаю сообщение об ошибке, пожалуйста, помогите мне stackoverflow.com/questions/58976896/ - person Panchal Amit; 21.11.2019

Аннотация Kotlin @Parcelize обрабатывает списки; вам просто нужно убедиться, что элементы списка также реализуют интерфейс Parcelable:

@Parcelize
data class MyDataClass(
    val items: List<MyListItem>?
) : Parcelable

@Parcelize
data class MyListItem(
    var type: String?,
    var itemId: Long = 0
) : Parcelable
person Tom Howard    schedule 10.07.2020