[Android] kotlin.UninitializedPropertyAccessException: lateinit property listener has not been initialized 에러

알린·2023년 5월 12일
0

TroubleShooting

목록 보기
5/25

에러원인

kotlin.UninitializedPropertyAccessException: lateinit property listener has not been initialized

  • lateinit으로 선언된 프로퍼티가 초기화되지 않은 상태에서 접근되었을 때 발생하는 오류
    내 코드에선 listener 프로퍼티가 초기화되지 않은 상태에서 listener.onItemClick()을 호출하려고 했기 때문에 오류가 남

해결방법

listener 프로퍼티를 초기화하기

오류가 난 전체 코드는 다음과 같다.

class BrandAdapter(private val context: CategoryPage) : RecyclerView.Adapter<BrandAdapter.ViewHolder>() {
    var brandList = mutableListOf<BrandModel>()

    lateinit var listener : OnBrandClickListener

    private val checkStatus = SparseBooleanArray(0)


    fun setListData(data:MutableList<BrandModel>){
        brandList = data
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BrandAdapter.ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.brand_name,parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: BrandAdapter.ViewHolder, position: Int) {

        val item: BrandModel=brandList[position]
        holder.name.text=item.name
        holder.cate.text=item.cate
        holder.num.text= item.num
        holder.cate_num.text= item.cate_num
        // holder.userid.text=item.userid
        //holder.grade.text= item.grade
    }

    override fun getItemCount(): Int {
        return brandList.size
    }

    inner class ViewHolder(itemView: View):RecyclerView.ViewHolder(itemView){

        val btn=itemView.btn_search
        val name:TextView=itemView.findViewById(R.id.name)
        val cate:TextView=itemView.findViewById(R.id.cate)
        val num:TextView=itemView.findViewById(R.id.num)
        val cate_num:TextView=itemView.findViewById(R.id.cate_num)
        val userid:TextView=itemView.findViewById(R.id.userid)
        val grade:TextView=itemView.findViewById(R.id.grade)

        init{
            itemView.setOnClickListener{
                listener.onItemClick(this,itemView,adapterPosition,
                    checkStatus,
                    itemView.name.text,
                    itemView.cate.text,
                    itemView.num.text,
                    itemView.cate_num.text,
                    itemView.userid.text,
                    itemView.grade.text)
            }

        }


    }
}

오류를 수정한 코드는 아래와 같다.

class BrandAdapter(private val context: CategoryPage) : RecyclerView.Adapter<BrandAdapter.ViewHolder>() {
    // ...

    var listener: OnBrandClickListener? = null

    // ...

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        // ...

        init {
            itemView.setOnClickListener {
                listener?.onItemClick(
                    this, itemView, adapterPosition,
                    checkStatus,
                    itemView.name.text,
                    itemView.cate.text,
                    itemView.num.text,
                    itemView.cate_num.text,
                    itemView.userid.text,
                    itemView.grade.text
                )
            }
        }
    }
}

위의 코드에서는 listener 프로퍼티를 Nullable 타입으로 변경하고, 필요한 시점에 초기화할 수 있도록 했다.
onItemClick()을 호출할 때 listener?.onItemClick() 형태로 호출하며, listener가 초기화되지 않은 경우에도 오류가 발생하지 않게 된다.

오류를 수정한 전체 코드는 아래와 같다.

class BrandAdapter(private val context: CategoryPage) : RecyclerView.Adapter<BrandAdapter.ViewHolder>() {
    var brandList = mutableListOf<BrandModel>()

    var listener: OnBrandClickListener? = null

    private val checkStatus = SparseBooleanArray(0)


    fun setListData(data:MutableList<BrandModel>){
        brandList = data
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BrandAdapter.ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.brand_name,parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: BrandAdapter.ViewHolder, position: Int) {

        val item: BrandModel=brandList[position]
        holder.name.text=item.name
        holder.cate.text=item.cate
        holder.num.text= item.num
        holder.cate_num.text= item.cate_num
        // holder.userid.text=item.userid
        //holder.grade.text= item.grade
    }

    override fun getItemCount(): Int {
        return brandList.size
    }

    inner class ViewHolder(itemView: View):RecyclerView.ViewHolder(itemView){

        val btn=itemView.btn_search
        val name:TextView=itemView.findViewById(R.id.name)
        val cate:TextView=itemView.findViewById(R.id.cate)
        val num:TextView=itemView.findViewById(R.id.num)
        val cate_num:TextView=itemView.findViewById(R.id.cate_num)
        val userid:TextView=itemView.findViewById(R.id.userid)
        val grade:TextView=itemView.findViewById(R.id.grade)

        init {
            itemView.setOnClickListener {
                listener?.onItemClick(
                    this, itemView, adapterPosition,
                    checkStatus,
                    itemView.name.text,
                    itemView.cate.text,
                    itemView.num.text,
                    itemView.cate_num.text,
                    itemView.userid.text,
                    itemView.grade.text
                )
            }
        }


    }
}
profile
Android 짱이 되고싶은 개발 기록 (+ ios도 조금씩,,👩🏻‍💻)

0개의 댓글