如何使用嵌套 classes 制作 parcelable class
How to make parcelable class with nested classes
我是 Android 开发人员的新手。我面临着这样一个事实,我需要将我的 class 重做成 Parcelable class。它的主要问题是我的 class 中嵌套了 3 个 classes。
这是我的代码:
class Test (var id: Int,
var numberQuestion: String,
var question: String,
var questionImageSrc: String,
var examination: Boolean,
var typeQuestion: String,
var singleChoiceAnswers: ArrayList<singleChoiceAnswer>,
var multipleChoiceAnswers: ArrayList<multipleChoiceAnswers>,
var inputAnswer: ArrayList<inputAnswer>): Parcelable{
constructor(source: Parcel): this(
source.readInt(),
source.readString(),
source.readString(),
source.readString(),
source.readByte(),
source.readString(),
// ????
)
companion object{
@JvmField
val CREATOR = object: Parcelable.Creator<Test>{
override fun newArray(size: Int) = arrayOfNulls<Test>(size)
override fun createFromParcel(source: Parcel?): Test {
return Test(source!!)
}
}
}
override fun writeToParcel(dest: Parcel?, flags: Int) {
dest?.writeInt(id)
dest?.writeString(numberQuestion)
dest?.writeString(question)
dest?.writeString(questionImageSrc)
dest?.writeValue(examination)
dest?.writeString(typeQuestion)
dest?.
}
override fun describeContents(): Int {
TODO("Not yet implemented")
}
}
data class multipleChoiceAnswers(var letter: String,
var text: String,
var correctAnswer: Boolean,
var checked: Boolean)
data class singleChoiceAnswer(var letter: String,
var text: String,
var correctAnswer: Boolean,
var checked: Boolean)
data class inputAnswer(var correctAnswer: String,
var userAnswer: String)
我也需要制作嵌套的 classes Parcelable 吗?我从 JSON 获取数据。如果你需要这里是link
提前谢谢你)
P.S。对不起我的英语
不需要那么做。只需使用 @Parcelize
from Kotlin。
用@Parcelize
注释所有这些classes,并使它们扩展Parcelable
。您可以在 Test
class.
中删除所有与 Parcelable
相关的代码
另外,我会建议修改一些我在您的代码中看到的错误:
- 将您的所有
var
属性变为 val
。它将强制执行不变性,这是 Kotlin 的基本功能之一。您的 ArrayList
也是如此,请改用 List
来禁止修改列表。如果你真的不能有一个只读的 List
然后使用 MutableList
。这是一个 read/write 列表比使用 ArrayList
. 更容易理解
- 让你的
Test
class 成为 data class
。我不明白你为什么不从中受益。
- 所有 classes 名称必须以大写字母开头。
multipleChoiceAnswers
-> MultipleChoiceAnswers
。这是我们在许多语言中都遵循的约定,而不仅仅是 Kotlin。
我是 Android 开发人员的新手。我面临着这样一个事实,我需要将我的 class 重做成 Parcelable class。它的主要问题是我的 class 中嵌套了 3 个 classes。
这是我的代码:
class Test (var id: Int,
var numberQuestion: String,
var question: String,
var questionImageSrc: String,
var examination: Boolean,
var typeQuestion: String,
var singleChoiceAnswers: ArrayList<singleChoiceAnswer>,
var multipleChoiceAnswers: ArrayList<multipleChoiceAnswers>,
var inputAnswer: ArrayList<inputAnswer>): Parcelable{
constructor(source: Parcel): this(
source.readInt(),
source.readString(),
source.readString(),
source.readString(),
source.readByte(),
source.readString(),
// ????
)
companion object{
@JvmField
val CREATOR = object: Parcelable.Creator<Test>{
override fun newArray(size: Int) = arrayOfNulls<Test>(size)
override fun createFromParcel(source: Parcel?): Test {
return Test(source!!)
}
}
}
override fun writeToParcel(dest: Parcel?, flags: Int) {
dest?.writeInt(id)
dest?.writeString(numberQuestion)
dest?.writeString(question)
dest?.writeString(questionImageSrc)
dest?.writeValue(examination)
dest?.writeString(typeQuestion)
dest?.
}
override fun describeContents(): Int {
TODO("Not yet implemented")
}
}
data class multipleChoiceAnswers(var letter: String,
var text: String,
var correctAnswer: Boolean,
var checked: Boolean)
data class singleChoiceAnswer(var letter: String,
var text: String,
var correctAnswer: Boolean,
var checked: Boolean)
data class inputAnswer(var correctAnswer: String,
var userAnswer: String)
我也需要制作嵌套的 classes Parcelable 吗?我从 JSON 获取数据。如果你需要这里是link
提前谢谢你) P.S。对不起我的英语
不需要那么做。只需使用 @Parcelize
from Kotlin。
用@Parcelize
注释所有这些classes,并使它们扩展Parcelable
。您可以在 Test
class.
Parcelable
相关的代码
另外,我会建议修改一些我在您的代码中看到的错误:
- 将您的所有
var
属性变为val
。它将强制执行不变性,这是 Kotlin 的基本功能之一。您的ArrayList
也是如此,请改用List
来禁止修改列表。如果你真的不能有一个只读的List
然后使用MutableList
。这是一个 read/write 列表比使用ArrayList
. 更容易理解
- 让你的
Test
class 成为data class
。我不明白你为什么不从中受益。 - 所有 classes 名称必须以大写字母开头。
multipleChoiceAnswers
->MultipleChoiceAnswers
。这是我们在许多语言中都遵循的约定,而不仅仅是 Kotlin。