Свойство ReinlerView lateinit mClickListener не было инициализировано - PullRequest
1 голос
/ 17 июня 2019

Я нашел учебное пособие о том, как реализовать onClickListener в RecyclerView, но потом не смог понять, почему код не работает.В журнале говорится, что свойство lateinit не было инициализировано.Я не уверен, почему он так сказал.Как бы я мог решить это?Это мой код адаптера:

class ListAdapter(private val data : ArrayList<test>): RecyclerView.Adapter<ListAdapter.ViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            LayoutInflater.from(parent.context)
                .inflate(R.layout.test, parent, false)
        )
    }
    lateinit var mClickListener: ClickListener
    fun setOnItemClickListener(aClickListener: ClickListener) {
        mClickListener = aClickListener
    }
    interface ClickListener {
        fun onClick(pos: Int, aView: View)
    }
    override fun getItemCount() = data.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val list = data[position]
        holder.view.txt.text = list.txt
        holder.view.txt2.text = list.txt2
        holder.view.txt3.text = list.txt3
        holder.view.txt4.text = list.txt4
        holder.view.txt5.text = list.txt5
    }
    inner class ViewHolder(val view: View) : RecyclerView.ViewHolder(view), View.OnClickListener {
        override fun onClick(v: View) {
            mClickListener.onClick(adapterPosition, v)
        }
        init {
            view.setOnClickListener(this)
        }
    }
}

Это часть кода в MainActivity:

 viewManager = LinearLayoutManager(this)
        val list = ArrayList<test>()
        recyclerView = findViewById<RecyclerView>(R.id.recyclerview).apply {
            setHasFixedSize(true)
            layoutManager = viewManager
            adapter = ListAdapter(list)
        }
        ListAdapter(list).setOnItemClickListener(object : ListAdapter.ClickListener {
            override fun onClick(pos: Int, aView: View) {
                Toast.makeText(applicationContext,"It works :)",Toast.LENGTH_SHORT).show()
            }
        })

1 Ответ

2 голосов
/ 17 июня 2019

Это потому, что вы настраиваете слушателя на другой экземпляр. Вы должны сделать что-то вроде этого:

recyclerView = ....apply {
    ...
    adapter = ListAdapter(list).apply {
        setOnItemClickListener(...)
    }
}

Другая возможность состоит в том, чтобы создать локальный val listAdapter, создать его экземпляр и установить слушателя и, наконец, в apply блоке RV установить adapter = listAdapter

...