如何实现List< Integer>的可拆分在科特林 [英] How to implement parcelable for List<Integer> in Kotlin
问题描述
我正试图使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< Integer>的可拆分在科特林的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!