본문 바로가기

개발 노트/Kotlin

[Android/Kotlin] 어댑터 콜백을 위한 Lambda 함수 전달

# 어댑터 클릭리스너를 람다로 표현하기

 

 

어댑터에서 파라미터에 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

 

https://medium.com/@ykm7003/kotlin-%EC%BD%94%ED%8B%80%EB%A6%B0-callback-%ED%95%A8%EC%88%98-219544f87f9a

 

[Kotlin] 코틀린 Callback 함수

What is the Callback?

medium.com

 

https://velog.io/@simsubeen/Android-Kotlin-%EB%A6%AC%EC%8A%A4%EB%84%88%EB%A5%BC-%EB%9E%8C%EB%8B%A4%EB%A1%9C-%ED%91%9C%ED%98%84%ED%95%98%EA%B8%B0

 

[Android / Kotlin] 리스너를 람다로 표현하기

RecyclerView를 구현할 때 아이템 클릭 이벤트를 사용하기 위해 Adapter 안에 인터페이스를 선언하고 인터페이스를 상속 받아 함수를 구현하여 사용했었다. 매번 이런식으로 인터페이스를 구현하여

velog.io

https://develop-writing.tistory.com/49

 

[Kotlin] Recyclerview click Event (람다 함수 사용)

이번에는 코틀린의 고차 함수와 람다 표현식을 사용해 RecyclerView에 Click Event를 추가해보겠습니다. 결과 과일 이름 리스트를 보여주고, 텍스트 뷰 하나만 있는 매우 심플한 Recyclerview입니다. 클릭

develop-writing.tistory.com