繁体   English   中英

如何包裹清单<Int>与科特林

[英]How to parcel List<Int> with kotlin

我想通过 Bundle 将数据类(包含 int 列表作为属性)传递给其他活动,因此我需要将 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)
    }
}

您可以将整数列表写为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
}

Kotlin 的@Parcelize注释处理列表; 您只需要确保列表项也实现Parcelable接口:

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

@Parcelize
data class MyListItem(
    var type: String?,
    var itemId: Long = 0
) : Parcelable

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM