# 어댑터 클릭리스너를 람다로 표현하기
어댑터에서 파라미터에 private val onClick : (Flower) -> Unit 이렇게 작성해준다
Unit은 반환 유형을 지정하지 않는 경우 기본적으로 Unit이 되고, 코틀린에서 값을 반환하지 않음을 의미한다
그리고 viewHolder에서 init을 사용해서 아이템 클릭리스너를 설정해준다
[invoke는 마치 함수인 것처럼 호출할 수 있도록 한다. (Flower) -> Unit를 호출하는 데 사용된다]
// 클릭 이벤트(onClick)
class FlowersAdapter(var flowerList : List<Flower>, private val onClick : (Flower) -> Unit) : RecyclerView.Adapter<FlowersAdapter.FlowerViewHolder>() {
// 화면(레이아웃) 연결 (여기서 멀티뷰타입 설정가능)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FlowerViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.flower_item, parent,false)
return FlowerViewHolder(FlowerItemBinding.bind(view), onClick)
}
// 데이터 연결
override fun onBindViewHolder(holder: FlowerViewHolder, position: Int) {
// bind함수에 있는 함수를 가져와서 데이터 뿌려줌
holder.bind(flowerList[position])
}
// 아이템 개수 리턴
override fun getItemCount(): Int {
return flowerList.size
}
class FlowerViewHolder(private var binding: FlowerItemBinding, private val onClick : (Flower) -> Unit) : RecyclerView.ViewHolder(binding.root){
private var currentFlower : Flower ?= null
init {
// 클릭 리스너
itemView.setOnClickListener {
currentFlower?.let {
onClick.invoke(it)
}
}
}
// 레이아웃과 데이터 연결
fun bind(flower: Flower){
currentFlower = flower
binding.flowerText.text = flower.name
binding.flowerImage.setImageResource(flower.image)
}
}
}
Adapter
이렇게 작성해주고
클릭이벤트를 실행하고자하는 Activity나 Fragment에서 아래와같이 아까작성했던 어댑터를 불러와서 클릭이벤트를 작성해주면 끝이다!
class MainActivity : AppCompatActivity() {
private val flowersAdapter : FlowersAdapter by lazy {
FlowersAdapter(flowerList()){ flower ->
// 람다식을 사용하면 함수를 선언할 필요가 없고, 코드 블럭을 직접 함수의 인자로 전달 할 수 있다
// 클릭 이벤트 작성
}
}
Activity
# 참고자료
https://pramonow.medium.com/passing-lambda-function-for-adapter-callback-in-kotlin-6c9552af7262
https://develop-writing.tistory.com/49
'개발 노트 > Kotlin' 카테고리의 다른 글
[Android/Kotlin] Fragment간 데이터통신(데이터전달) (0) | 2024.04.12 |
---|---|
[Android / Kotlin] Recyclerview에 구분선 표시 (0) | 2024.04.11 |
[Android/Kotlin] Activity, Fragment간 데이터 주고받기 (0) | 2024.04.10 |
[Android/Kotlin] 세로/가로 모드 ui 분리 구현 (1) | 2024.04.07 |
[Android] Fragment간 데이터통신 방식 (0) | 2024.03.29 |