기술적용
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()
}
})
}