마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리사이클러뷰 onBindViewHolder 내부 Listener 생성 질문

0 추천

구글링을 통해 onBindViewHolder에서 뷰의 리스너를 생성하는 방법이 좋지 않다는 것을 알게 되었습니다.

하지만 제가 만약 아래코드와 같이 repoList데이터를 이용하여 view마다 다르게 리스너를 설정해주어야 한다면 이때도 onBindViewHolder메서드가 아닌 ViewHolder클래스에서 해주는게 더 나은 방법일까요? 

override fun onBindViewHolder(holder: FriendRepoListHolder, position: Int) {
    holder.apply {
        repoList[position].apply {
            binding.friendActivityRepositoryTextview.text = "${this.owner}/${this.name}"
            binding.friendActivityRepositoryLinearView.setOnClickListener {
                val intent = Intent(
                    Intent.ACTION_VIEW,
                    Uri.parse("https://github.com/${this.owner}/${this.name}")
                )
                itemView.context.startActivity(intent)
            }
        }
    }
}

위의 코드를 아래와 같이 바꾸어 주었을 때 이점이 무엇인지 정확히 이해하지 못하겠습니다.

inner class FriendRepoListHolder(val binding: RecyclerViewItemFriendRepoListBinding) :
    RecyclerView.ViewHolder(binding.root) {
    init {
        binding.friendActivityRepositoryLinearView.setOnClickListener {
            val intent = Intent(
                Intent.ACTION_VIEW,
                Uri.parse("https://github.com/${repoList[bindingAdapterPosition].owner}/${repoList[bindingAdapterPosition].name}")
            )
            itemView.context.startActivity(intent)
        }
    }

    fun bind(item: Repositories) {
        binding.friendActivityRepositoryTextview.text = "${item.owner}/${item.name}"
    }
}
override fun onBindViewHolder(holder: FriendRepoListHolder, position: Int) {
    holder.bind(repoList[position])
}

 

want8607 (260 포인트) 님이 2022년 8월 30일 질문

1개의 답변

+1 추천
 
채택된 답변
이점이 이해가 가지 않거나 님의 상황에 맞지 않는다면 따라가실 필요가 없다고 생각합니다. 코드를 관리하는 사람은 님이지 해당 포스팅을 작성한 사람이 아니니까요. 당연히 님이 수용할 수 있는 코드여야 추후에 변경사항이 생길 때 대처하기가 쉽습니다. 인터넷상에 나온 베스트 프랙티스는 상대적인 겁니다. 상황이 맞아 떨어질 때만 적용하는 것이 좋다고 봅니다.
spark (227,530 포인트) 님이 2022년 8월 31일 답변
want8607님이 2022년 8월 31일 채택됨
그리고 예제 코드이 차이점은 onCrewateViewHolder는 재사용 가능한 아이템 갯수만큼만 호출아 되지만 onBindViewHolder는 모든 아이템에 대해 호출아 도비니다. 리사이클러뷰는 뷰홀더를 화면 보일 정도의 갯수만큼만 생성하고 나머지는 재사용을 합니다. 따라서 ViewHilder의 init블록 안에 있는 코드도 ViewHolder생성 횟수만큼만 호출이 될 겁니다.
제가 보기에는 그닥 크리티컬한 부분은 아니고 오히려 해당 코드를 어댑터 외부에서 리스너를 통해 호출하는 것이 좀 더 나아 보입니다.
말씀하신 좋은 충고 감사합니다.
외부에서 리스너를 통해 호출하는게 더 나아보이신다고 하신 이유가 궁금합니다.
어댑터는 호출한 쪽의 정보가 없을 수록 나아요. 그래야 재사용성도 높아지고 해당 리스너에 대한 부분이 변경될 때 어댑터를 건드릴 필요없이 리스너를 구현한 부분만 변경하면 되니까요.
아 어댑터의 재사용성을 생각했을 때 외부에서 호출하는 것이 더 유리하겠네요
정말 좋은 답변 감사드립니다.
...