본문 바로가기

Android + Kotlin

RecyclerView Adapter 안에서 click().throttleFirst() 사용하는 방법

반응형

우리는 RecyclerView 리스트를 만들고 ViewHolder에서 click event를 사용합니다.

이때 중복 클릭을 막기위해서 throttleFirst()를 사용하는데, 이를 사용하기 위해서는 lifecycleScope가 필요합니다.

하지만, 단순히 ViewHolder의 init{} 에서 lifecycleScope 값을 얻을 수가 없습니다.

 

init{} 은 초기화 단계로 아직 view가 attach가 안된 상태입니다.

그렇게 때문에 lifecycleScope값은 null인 상태인 것이죠.

여기까지 설명 드렸으면 감이 오시겠죠?!!

맞습니다. view가 attach가 된 이후에 lifecycleScope 값을 가져오면 됩니다.

 

그럼, 어떻게 attach가 된 후에 throttleFirst()를 호출하는지 코드로 보여드립니다.

 

inner class ItemViewHolder(
    private val binding: ItemLayoutBinding
): RecyclerView.ViewHolder(binding.root) {

    init {
        itemView.doOnAttach {
            itemView.findViewTreeLifecycleOwner()?.let {
                binding.lifecycleOwner = it
                binding.button
                  .click()
                  .throttleFirst(300)
                  .onEach {
                      // TODO. 클릭 처리
                  }.launchIn(it.lifecycleScope)
            }
        }
        itemView.doOnDetach {
            binding.lifecycleOwner = null
        }
    }
    
}

 

위의 코드에서 itemView.doOnAttach {} 이 부분이 제일 중요합니다.

바로 itemView가 attach가 된 후에 호출이 되는 부분이기 때문입니다.

이후엔 itemView.findViewTreeLifecycleOwner() 를 통해서 손쉽게 lifecycleOwner 값과 lifecycleScope를 이용할 수 있습니다.

 

 

오늘 즐프밍~^^

반응형