문제의 원인이 뷰홀더가 아니라 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);
}