이전 글에서는 리사이클러 뷰의 사용 방법에 대해 알아봤다. 이번에는 리스트 내의 아이템 클릭 시 이벤트를 발생시키는 방법을 알아본다.
어댑터 클래스
먼저 이전 글에서 만들었던 리사이클러 뷰의 어댑터 클래스다.
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()
}
}
여기서는 클릭 시 해당 아이템의 내용을 토스트로 출력하게 했다.
아이템 클릭 시 토스트가 나온다.
'프로그래밍 > 안드로이드' 카테고리의 다른 글
[Android/Firebase] 안드로이드 프로젝트에 Firestore 연동 (0) | 2021.01.03 |
---|---|
[Android/Kotlin] DialogFragment 커스텀 대화상자 만들기 (0) | 2021.01.02 |
[Android/Kotlin] Dialog 대화상자 표시 (0) | 2021.01.01 |
[Android/Kotlin] RecyclerView 리사이클러 뷰 (0) | 2020.12.31 |
[Android/Kotlin] View Binding 뷰 바인딩 (1) | 2020.12.30 |