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

오늘 즐프밍~^^
반응형
'Android + Kotlin' 카테고리의 다른 글
Linkify 에서 WEB_URL 패턴을 커스텀해보자. (0) | 2023.01.15 |
---|---|
커스텀 debounce 를 만들자! (0) | 2023.01.12 |
손쉽게 Int, Float 를 dp로 변환하는 extension 코드 (0) | 2022.12.29 |
[Android + Kotlin] PagingDataAdapter에서 "좋아요"를 해보자. (payload update) (0) | 2022.08.29 |
[Android + Kotlin] Shimmer 라이브러리를 이용하여 로딩 화면 만들기 (0) | 2022.08.10 |