# 어댑터 클릭리스너를 람다로 표현하기
어댑터에서 파라미터에 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
Passing Lambda Function for Adapter Callback in Kotlin
Kotlin has been a blast for the past 3 years. It has introduced Android programmer into the world of Functional Programming. There are a…
pramonow.medium.com
[Kotlin] 코틀린 Callback 함수
What is the Callback?
medium.com
[Android / Kotlin] 리스너를 람다로 표현하기
RecyclerView를 구현할 때 아이템 클릭 이벤트를 사용하기 위해 Adapter 안에 인터페이스를 선언하고 인터페이스를 상속 받아 함수를 구현하여 사용했었다. 매번 이런식으로 인터페이스를 구현하여
velog.io
https://develop-writing.tistory.com/49
[Kotlin] Recyclerview click Event (람다 함수 사용)
이번에는 코틀린의 고차 함수와 람다 표현식을 사용해 RecyclerView에 Click Event를 추가해보겠습니다. 결과 과일 이름 리스트를 보여주고, 텍스트 뷰 하나만 있는 매우 심플한 Recyclerview입니다. 클릭
develop-writing.tistory.com
'개발 노트 > 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 |