기술적용

RecyclerView 클릭 이벤트 적용

131 developer 2022. 4. 26. 12:18

 

 

Adapter에 리스터 인터페이스 추가

private lateinit var itemClickListener : OnItemClickListener
interface OnItemClickListener {
    fun onClick(v: View, position: Int, item : CalendarDay)
}

fun setItemClickListener(onItemClickListener : OnItemClickListener) {
    this.itemClickListener = onItemClickListener
}

 

 

 

onBindViewHolder에 setOnclickListener 추가

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

    // 클릭 이벤트
        holder.binding.itemReadIbtn.setOnClickListener {
            itemClickListener.onClick(it, position, dayList[position])
        }
    
}

 

 

Activity 혹은 Fragment에 setItemClickListener를 호출하고 OnItemClickListener를 익명 개체로 넘김

//클릭 이벤트
calendarAdapter.setItemClickListener(object: CalendarAdapter.OnItemClickListener{
    override fun onClick(v: View, position: Int, item : CalendarDay) {
        Toast.makeText(view?.context, dayList[position].day + "일!!" , Toast.LENGTH_SHORT).show()
    }
})

 

 

 

 

전체 코드

Adapter

class CalendarAdapter(calendarList : ArrayList<CalendarDay>) 
		: RecyclerView.Adapter<CalendarAdapter.CalendarViewHolder>() {
    private var dayList : ArrayList<CalendarDay> = calendarList
    private lateinit var itemClickListener : OnItemClickListener

    inner class CalendarViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val binding = ItemCalendarBinding.bind(itemView)
    }

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

    override fun onBindViewHolder(holder: CalendarViewHolder, position: Int) {
        holder.binding.calDay = dayList[position]

        // 클릭 이벤트
        holder.binding.itemReadIbtn.setOnClickListener {
            itemClickListener.onClick(it, position, dayList[position])
        }
    }

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

    object DataBindingAdapter {
        @BindingAdapter("readCheck")
        @JvmStatic
        fun setReadCheck(imageButton: ImageButton, calDay : CalendarDay) {
            if (!calDay.isEmpty) {
                imageButton.visibility = View.VISIBLE
                if (calDay.isRead) {
                    imageButton.setImageResource(R.drawable.ic_baseline_brightness_check_1_24)
                }
            }
        }
    }

    interface OnItemClickListener {
        fun onClick(v: View, position: Int, item : CalendarDay)
    }

    fun setItemClickListener(onItemClickListener : OnItemClickListener) {
        this.itemClickListener = onItemClickListener
    }

}

 

 

Fragment

//Calendar 셋팅
private fun setCalendar(readingList : List<String>) {
    //년,월 텍스트 뷰 셋팅
    binding.calCurrentDateTv.text = monthYearFromDate(selectedDate)

    val dayList = mainViewModel.daysInMonthArray(selectedDate, readingList)
    val calendarAdapter = CalendarAdapter(dayList)

    binding.calRecyclerview.layoutManager = GridLayoutManager(context,
        7)
    binding.calRecyclerview.adapter = calendarAdapter

    //클릭 이벤트
        calendarAdapter.setItemClickListener(object: CalendarAdapter.OnItemClickListener{
            override fun onClick(v: View, position: Int, item : CalendarDay) {
                Toast.makeText(view?.context, item.day + "일!! " + item.isRead , Toast.LENGTH_SHORT).show()
            }
        })

}