Почему я не могу инициализировать свойство onCreateViewHolder в Kotlin? - PullRequest
0 голосов
/ 03 декабря 2018

Я инициализирую свойство mListMy в onCreateViewHolder событии, но получаю сообщение об ошибке

свойство lateinit mListMy не было инициализировано

Как исправитьэто?

Код

class MydAdapter () : RecyclerView.Adapter<MydAdapter.MyViewHolder>() {

   private lateinit var mListMy: List<MRecord>

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MydAdapter.MyViewHolder {
        initListMy()

        val v = LayoutInflater.from(parent.context).inflate(R.layout.item_recyclerview_my, parent, false)
        return MyViewHolder(v)
    }

    fun initListMy(){
        mListMy=RecordHandler().listAllRecord(ESortBy.NameAsc,ECategory.My)
    }

    override fun onBindViewHolder(holder: MydAdapter.MyViewHolder, position: Int) {
        holder.bindItems(mListMy[position])
    }

}

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Вы можете инициализировать свой список в конструкторе, посмотрите на строку ниже:

class MydAdapter (val mListMy:List<YourDatamodel> = listOf() ) : RecyclerView.Adapter<MydAdapter.MyViewHolder>()
// rest of your code

Таким образом, вы можете вызывать свой адаптер без инициализации вашего списка, потому что он уже инициализирован со значением по умолчанию (пустой список).

0 голосов
/ 03 декабря 2018

Для инициализации свойства вы можете использовать init блок kotlin.Который вызывается после вызова конструктора.

class MydAdapter () : RecyclerView.Adapter<MydAdapter.MyViewHolder>() {

    private lateinit var mListMy: List<MRecord>

    init {
        initListMy()
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MydAdapter.MyViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.item_recyclerview_my, parent, false)
        return MyViewHolder(v)
    }

    fun initListMy(){
        mListMy=RecordHandler().listAllRecord(ESortBy.NameAsc,ECategory.My)
    }

    override fun onBindViewHolder(holder: MydAdapter.MyViewHolder, position: Int) {
        holder.bindItems(mListMy[position])
    }
}
0 голосов
/ 03 декабря 2018

В котлине lateinit модификатор не допускает свойства с инициализатором.lateinit означает, что вы присвоите значение этой переменной позже, а не в инициализаторе.

для этих случаев вы можете использовать обычный var.в противном случае это должен быть конструктор, подобный этому

class MydAdapter (va1 mListMy:List<YourDatamodel> ) : RecyclerView.Adapter<MydAdapter.MyViewHolder>() {



override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MydAdapter.MyViewHolder {

    val v = LayoutInflater.from(parent.context).inflate(R.layout.item_recyclerview_my, parent, false)
    return MyViewHolder(v)
}



override fun onBindViewHolder(holder: MydAdapter.MyViewHolder, position: Int) {
    holder.bindItems(mListMy[position])
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...