如何实现List< Integer>的可拆分在科特林 [英] How to implement parcelable for List<Integer> in Kotlin

查看:62
本文介绍了如何实现List< Integer>的可拆分在科特林的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正试图使Parcelable达到以下等级

I am trying to make Parcelable of below class

data class Movie(
    @SerializedName("popularity")
    @Expose
    var popularity: Double,

    @SerializedName("vote_count")
    @Expose
    var voteCount: Int,

    @SerializedName("video")
    @Expose
    var video: Boolean,

    @SerializedName("poster_path")
    @Expose
    var posterPath: String?,

    @SerializedName("id")
    @Expose
    var id: Int,

    @SerializedName("adult")
    @Expose
    var adult: Boolean,

    @SerializedName("backdrop_path")
    @Expose
    var backdropPath: String?,

    @SerializedName("original_language")
    @Expose
    var originalLanguage: String?,

    @SerializedName("original_title")
    @Expose
    var originalTitle: String?,

    @SerializedName("genre_ids")
    @Expose
    var genreIds: List<Integer>,

    @SerializedName("title")
    @Expose
    var title: String?,

    @SerializedName("vote_average")
    @Expose
    var voteAverage: Double,

    @SerializedName("overview")
    @Expose
    var overview: String?,

    @SerializedName("release_date")
    @Expose
    var releaseDate: String?
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readDouble(),
        parcel.readInt(),
        parcel.readByte() != 0.toByte(),
        parcel.readString(),
        parcel.readInt(),
        parcel.readByte() != 0.toByte(),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        TODO("genreIds"),   <-------------- Which is generated by "Android Parcelable code generator" plugin
        parcel.readString(),
        parcel.readDouble(),
        parcel.readString(),
        parcel.readString()
    ) {
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeDouble(popularity)
        parcel.writeInt(voteCount)
        parcel.writeByte(if (video) 1 else 0)
        parcel.writeString(posterPath)
        parcel.writeInt(id)
        parcel.writeByte(if (adult) 1 else 0)
        parcel.writeString(backdropPath)
        parcel.writeString(originalLanguage)
        parcel.writeString(originalTitle)
        parcel.writeString(title)
        parcel.writeDouble(voteAverage)
        parcel.writeString(overview)
        parcel.writeString(releaseDate)
    }

    override fun describeContents(): Int {
        return 0
    }

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

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

我遇到了错误,因此我从此网站找到解决方法用于列表< Long>

I was getting an error so I have found solution from this website How to implement parcelable for List<Long>

并像下面这样

parcel.readList("genreIds",null),

但是我仍然收到类似

也通过关注此页面 如何打包清单< Int>与科特林 我添加了如下扩展功能

And also by follwing this page How to parcel List<Int> with kotlin I have added extension functions like below

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
}

您好@Eugen Pechanec首先非常感谢您的帮助,根据您的建议,我已经完成了 Int 而不是 Integer ,但是在readArrayList中我仍然得到错误

Hi @Eugen Pechanec first of all thank you so much for your help, as per you suggestion I have done Int instead of Integer but in readArrayList still I am getting an error

推荐答案

借助@ Eugen Pechanec& @Networks我找到了下面的解决方案,

With the help of @ Eugen Pechanec & @Networks I found solution which is below,

 data class Movie(
    @SerializedName("popularity")
    @Expose
    var popularity: Double,

    @SerializedName("vote_count")
    @Expose
    var voteCount: Int,

    @SerializedName("video")
    @Expose
    var video: Boolean,

    @SerializedName("poster_path")
    @Expose
    var posterPath: String?,

    @SerializedName("id")
    @Expose
    var id: Int,

    @SerializedName("adult")
    @Expose
    var adult: Boolean,

    @SerializedName("backdrop_path")
    @Expose
    var backdropPath: String?,

    @SerializedName("original_language")
    @Expose
    var originalLanguage: String?,

    @SerializedName("original_title")
    @Expose
    var originalTitle: String?,

    @SerializedName("genre_ids")
    @Ignore
    var genreIds: List<Int>,

    @SerializedName("title")
    @Expose
    var title: String?,

    @SerializedName("vote_average")
    @Expose
    var voteAverage: Double,

    @SerializedName("overview")
    @Expose
    var overview: String?,

    @SerializedName("release_date")
    @Expose
    var releaseDate: String?
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readDouble(),
        parcel.readInt(),
        parcel.readByte() != 0.toByte(),
        parcel.readString(),
        parcel.readInt(),
        parcel.readByte() != 0.toByte(),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.createIntList(),  //<-------------------------- change here
        parcel.readString(),
        parcel.readDouble(),
        parcel.readString(),
        parcel.readString()
    )
    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeDouble(popularity)
        parcel.writeInt(voteCount)
        parcel.writeByte(if (video) 1 else 0)
        parcel.writeString(posterPath)
        parcel.writeInt(id)
        parcel.writeByte(if (adult) 1 else 0)
        parcel.writeString(backdropPath)
        parcel.writeString(originalLanguage)
        parcel.writeString(originalTitle)
        parcel.writeIntList(genreIds) //<-------------------------- change here
        parcel.writeString(title)
        parcel.writeDouble(voteAverage)
        parcel.writeString(overview)
        parcel.writeString(releaseDate)
    }

    override fun describeContents(): Int {
        return 0
    }

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

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


    }
}


            fun Parcel.createIntList(): List<Int> {
                val size = readInt()
                val output = ArrayList<Int>(size)
                for (i in 0 until size) {
                    output.add(readInt())
                }
                return output
            }

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

这篇关于如何实现List&lt; Integer&gt;的可拆分在科特林的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆