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

애덥터가 이상하게 반응해요.. ㅜ

0 추천
inner class CommentViewHolder(
    private val binding: ItemCommentBinding
) : RecyclerView.ViewHolder(binding.root) {
    val commentLike= itemView.findViewById<ImageView>(R.id.comment_like_iv)
    val commentTv= itemView.findViewById<TextView>(R.id.comment_like_count)
    val nicknameTv= itemView.findViewById<TextView>(R.id.comment_nickname)
    val contentTv = itemView.findViewById<TextView>(R.id.comment_content)
    val moreBtn = itemView.findViewById<ImageView>(R.id.btn_comment_more)
    val likeTv = itemView.findViewById<TextView>(R.id.comment_like_count)
    val likeBtn = itemView.findViewById<ConstraintLayout>(R.id.btn_comment_like)
    val likeIv = itemView.findViewById<ImageView>(R.id.comment_like_iv)

    fun bind(item: Comment, position: Int, viewModel: PostViewModel) {
        lateinit var replyListAdapter: ReplyAdapter
        binding.setVariable(BR.item, item)
        binding.executePendingBindings()
        likeBtn.setOnClickListener {
            viewModel.likeComment(type,item.commentId,commentLike, commentTv)
            viewModel.isLikedComment.observe(lifecycleowner) { event ->
                event.getContentIfNotHandled()?.let {
                    if (it) {
                        likeTv.text = (item.likeCount.toInt() + 1).toString()
                        item.likeCount = (item.likeCount.toInt() + 1).toString()
                        likeIv.setColorFilter(Color.parseColor("#FF7663"))
                    }
                }
            }
            viewModel.isUnlikeComment.observe(lifecycleowner) { event ->
                event.getContentIfNotHandled()?.let {
                    if (it) {
                        likeTv.text = (item.likeCount.toInt() - 1).toString()
                        item.likeCount = (item.likeCount.toInt() - 1).toString()
                        likeIv.setColorFilter(Color.parseColor("#CFCFCF"))
                    }
                }
            }
            //commentClickListener.onLikeComment(position, item)
        }

위 코드처럼 뷰홀더 만들었는데 리사이클러뷰에 어떤 아이템을 눌러도 맨 첫번째로 누른 아이템만 좋아요 수 + 1/ 좋아요 버튼 색깔 바뀌기,가 되네요. 계속 봐도 모르겠어서 도움 요청합니다....ㅠ

ㅜㅠ (280 포인트) 님이 2023년 1월 24일 질문

1개의 답변

+1 추천
 
채택된 답변

문제의 원인이 뷰홀더가 아니라 ViewModel에 있을 가능성이 높아 보입니다. 다른 가능성은 아이템이 화면에 보이는 것 보다 많이 존재할 때, 스크롤을 할 경우, 뷰홀더가 재사용되므로, 엉뚱한 뷰홀더가 업데이트 되는 경우입니다.

그리고 좀 더 재사용이 가능한 나은 구조는 아래와 같이 Activity/Fragment에서 어댑터의 이벤트를 받아서 ViewModel 을 호출하고 ViewModel로부터 업데이트된 리스트를 받아서 어댑터를 갱신하는 형태입니다.

inner class CommentViewHolder(
    private val binding: ItemCommentBinding,
    private var onCommentClicked: ((Comment) -> Unit)? = null
) : RecyclerView.ViewHolder(binding.root) {

    fun bind(item: Comment) {
        ...
        
        likeBtn.setOnClickListener {
            onCommentClicked?.invoke(item)            
        }
    }
}


class ReplyAdapter: RecyclerView.Adapter<CommentViewHolder> {
 
    var onCommentClicked: ((Comment) -> Unit)? = null

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CommentViewHolder {
        val binding = ....
        return CommentViewHolder(binding, onCommentClicked)
    }
}


// View
private val replyListAdapter: ReplyAdapter

...

override fun onCreate (savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    ...

    replyListAdapter = ....
    replyListAdapter.onCommentClicked = { comment ->
          viewModel.commentClicked(comment)
     }

    viewModel.comments.observe(this, ::bindComments)

}

private fun bindComments(comments: List<Comment>) {
    replyListAdapter.setItems(comments);
}



 

spark (224,800 포인트) 님이 2023년 1월 24일 답변
ㅜㅠ님이 2023년 1월 24일 채택됨
감사합니다! ㅠ 바로 해봐야겠어요
...