androidkotlinlateinit

lateinit property mClickListener has not been initialized Adapter kotlin


i make adaper onclick listener but somehow theres error message lateinit property mClickListener has not been initialized Adapter kotlin

variable on click

lateinit var mClickListener: ItemClickListener

base view holder

inner class AdapterListProjectVH2(itemView: View) : BaseViewHolder(itemView),
        View.OnClickListener {
        private val cvItemViewVisualInsp: CardView =
            itemView.findViewById(R.id.cv_itemview_visual_insp)
        private val imgMarkOnMap: ImageView = itemView.findViewById(R.id.img_mark_on_map)
        private val imgStatusSync: ImageView = itemView.findViewById(R.id.img_status_sync)
        //private val imgStatusRegister : ImageView = itemView.findViewById(R.id.img_status_register)

        private val tvFootpathTypeName: TextView = itemView.findViewById(R.id.tv_foot_type_name)
        private val tvSeverityTypeName: TextView = itemView.findViewById(R.id.tv_severity_type)
        private val tvRepairMethodName: TextView = itemView.findViewById(R.id.tv_repair_method_name)
        private val tvRfCreatedDate: TextView =
            itemView.findViewById(R.id.tv_rf_created_date)
        private val clInspected: ConstraintLayout = itemView.findViewById(R.id.cl_inspected)

        private val imageSlider: SliderView = itemView.findViewById(R.id.imageSlider)

        init {
            cvItemViewVisualInsp.setOnClickListener(this)
        }

overide click function

override fun onClick(v: View?) {
            mClickListener.onClickItem(adapterPosition, itemView, mData?.get(adapterPosition))
        }
 fun setOnItemClickListener(clickListener: ItemClickListener) {
        mClickListener = clickListener
    }

    fun clear() {
        this.mData!!.clear()
        notifyDataSetChanged()
    }

    interface ItemClickListener {
        fun onClickItem(
            pos: Int,
            aView: View,
            data: ViewFootpathEntityWIthAllData?
        )
    }

Activity call onclick listerner

  footPathadapter = FootpathAdapter(this, footPathDataList)
        footPathadapter?.setOnItemClickListener(object : FootpathAdapter.ItemClickListener{
            override fun onClickItem(pos: Int, aView: View, data: ViewFootpathEntityWIthAllData?) {
                startActivity(Intent(this@FormFootpathActivity, MainActivity::class.java))
            }
        })

Solution

  • You are creating the Adapter instance before passing mClickListener, when you create the adapter an instance of AdapterListProjectVH2 is going to be created and the this code is going to be executed:

        init {
            cvItemViewVisualInsp.setOnClickListener(this)
        }
    

    Which will cose the error because this cause is going to be executed before you set the mClickListener.

    So you can initialize mClickListener as null like that:

    var mClickListener: ItemClickListener? = null
    

    And add a null check when call it like that:

    override fun onClick(v: View?) {
        mClickListener?.onClickItem(adapterPosition, itemView, mData?.get(adapterPosition))
    }