Android + Kotlin

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

heeeju4lov 2023. 1. 11. 21:44
반응형

우리는 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를 이용할 수 있습니다.

 

 

오늘 즐프밍~^^

반응형