본문 바로가기

프로그래밍/안드로이드

[Android/Kotlin] 리사이클러 뷰 클릭 이벤트

이전 글에서는 리사이클러 뷰의 사용 방법에 대해 알아봤다. 이번에는 리스트 내의 아이템 클릭 시 이벤트를 발생시키는 방법을 알아본다.


어댑터 클래스

먼저 이전 글에서 만들었던 리사이클러 뷰의 어댑터 클래스다.

ListAdapter.kt
 
class ListAdapter(val itemList: ArrayList<ListItem>): RecyclerView.Adapter<ListAdapter.ViewHolder>() {
    // (1) 아이템 레이아웃과 결합
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListAdapter.ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)
        return ViewHolder(view)
    }
    // (2) 리스트 내 아이템 개수
    override fun getItemCount(): Int {
        return itemList.size
    }
    // (3) View에 내용 입력
    override fun onBindViewHolder(holder: ListAdapter.ViewHolder, position: Int) {
        holder.name.text = itemList[position].name
        holder.number.text = itemList[position].number
    }
    // (4) 레이아웃 내 View 연결
    class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
        val name: TextView = itemView.findViewById(R.id.tv_name)
        val number: TextView = itemView.findViewById(R.id.tv_number)
    }
}

onBindViewHolder와 클래스 하단에 아래 코드 구문을 추가한다.

ListAdapter.kt
 
class ListAdapter(val itemList: ArrayList<ListItem>): RecyclerView.Adapter<ListAdapter.ViewHolder>() {
    override fun onBindViewHolder(holder: ListAdapter.ViewHolder, position: Int) {
        // (1) 리스트 내 항목 클릭 시 onClick() 호출
        holder.itemView.setOnClickListener {
            itemClickListener.onClick(it, position)
        }
    }
    // (2) 리스너 인터페이스
    interface OnItemClickListener {
        fun onClick(v: View, position: Int)
    }
    // (3) 외부에서 클릭 시 이벤트 설정
    fun setItemClickListener(onItemClickListener: OnItemClickListener) {
        this.itemClickListener = onItemClickListener
    }
    // (4) setItemClickListener로 설정한 함수 실행
    private lateinit var itemClickListener : OnItemClickListener
}

 

작동 방식은 다음과 같다.

 

itemClickListener OnItemClickListener setItemClickListener
(어댑터) (액티비티)

 

액티비티

이제 액티비티로 와서 setItemClickListener를 호출하고 OnItemClickListener를 익명 개체로 넘겨준다.

MainActivity.kt
 
class MainActivity : AppCompatActivity() {
    private lateinit var binding : ActivityMainBinding
    val itemList = arrayListOf<ListItem>()      // 아이템 배열
    val listAdapter = ListAdapter(itemList)     // 어댑터

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)
        
        binding.rvList.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        binding.rvList.adapter = listAdapter

        listAdapter.setItemClickListener(object: ListAdapter.OnItemClickListener{
            override fun onClick(v: View, position: Int) {
                // 클릭 시 이벤트 작성
                Toast.makeText(view.context,
                        "${itemList[position].name}\n${itemList[position].number}",
                        Toast.LENGTH_SHORT).show()
            }
        })
        
        itemList.add(ListItem("Ada", "010-1234-5678"))
        itemList.add(ListItem("James", "010-1234-5678"))
        itemList.add(ListItem("John", "010-1234-5678"))
        itemList.add(ListItem("Cena", "010-1234-5678"))
        listAdapter.notifyDataSetChanged()
    }
}

여기서는 클릭 시 해당 아이템의 내용을 토스트로 출력하게 했다.

 

실행 결과

아이템 클릭 시 토스트가 나온다.