에러원인
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
)
}
}
}
}