I want to pass a data class (that contains list of int as a property) to other activity through Bundle and therefore i need to add Parcelable implementation to my data class. any idea about how to parcel this property?
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)
}
}
The kotlin-parcelize plugin provides a Parcelable implementation generator. @Parcelize requires all serialized properties to be declared in the primary constructor. The plugin issues a warning on each property with a backing field declared in the class body.
Save. In Android, to pass the data from one activity to another activity, we use the Parcelable. The kotlin-parcelize plugin provides a Parcelable implementation generator. The Android's Parcelable is an interface on which, the values can be written and read from a Parcel.
A Parcelable is the Android implementation of the Java Serializable. It assumes a certain structure and way of processing it. This way a Parcelable can be processed relatively fast, compared to the standard Java serialization.
Kotlin's @Parcelize
annotation handles lists; you just need to make sure the list items implement the Parcelable
interface as well:
@Parcelize
data class MyDataClass(
val items: List<MyListItem>?
) : Parcelable
@Parcelize
data class MyListItem(
var type: String?,
var itemId: Long = 0
) : Parcelable
You can write a list of integers as int[]
:
parcel.writeIntArray(files.toIntArray())
Make sure you use the same data structure when reading back:
files = parcel.createIntArray().toList()
You could make it more efficient using extension functions by skipping the array representation:
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
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With