使用辅助构造函数创建一个Parcelable类,该构造函数将列表作为Kotlin中的参数

时间:2017-12-18 13:13:31

标签: android list kotlin parcelable

我开始使用Kotlin并尝试实现一个可接受的对象,它接收一个字符串列表作为辅助构造函数的参数。但是,我收到了错误:

  

无法访问'<这个>'在调用超类构造函数之前

这是我的代码:

class StringChecker(val stringList : List<String>) : Parcelable {

    var mStringList = stringList

    constructor(parcel: Parcel) : this(parcel.readStringList(mStringList))

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeStringList(mStringList)
    }

    override fun describeContents(): Int {
        return 0
    }

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

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

}

我知道在创建对象之前我无法调用成员变量mStringList,这当然有意义,但readStringList方法需要字符串列表参数。我该如何解决这个问题?这是我的设计parcelable与将列表作为构造函数参数的问题吗?

2 个答案:

答案 0 :(得分:2)

对于这种特定情况,您可以将其写为

constructor(parcel: Parcel) : this(mutableListOf<String>()) {
  parcel.readStringList(mStringList)
}

但我更愿意只是让它成为工厂方法,而不是构造函数。特别是因为无论如何你需要它用于工厂方法。即:

companion object CREATOR : Parcelable.Creator<StringChecker> {
    override fun createFromParcel(parcel: Parcel): StringChecker {
        val stringList = mutableListOf<String>()
        parcel.readStringList(stringList)
        return StringChecker(stringList)
    }

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

更多:您可能不希望同时拥有stringListmStringList属性,就像您的代码目前所做的那样。如果需要var,请改为class StringChecker(var stringList : List<String>)。另请查看@Parcelize

答案 1 :(得分:1)

您不能在辅助构造函数中使用字段。使用createStringArrayList()代替readStringList(mStringList)

constructor(parcel: Parcel) : this(parcel.createStringArrayList())
相关问题