[Android/Team] ViewHolder 의 재사용과 초기화 for kotlin

이도연·2023년 11월 13일
0

trouble shooting

목록 보기
9/12

when (user.user_compat) {
            "A" -> holder.user_heart1.visibility = View.VISIBLE
            "B" -> {
                holder.user_heart4.visibility = View.GONE
            }
            "C" -> {
                holder.user_heart3.visibility = View.GONE
                holder.user_heart4.visibility = View.GONE

            }
            "D" -> {
                holder.user_heart2.visibility = View.GONE
                holder.user_heart3.visibility = View.GONE
                holder.user_heart4.visibility = View.GONE
            }
        }

개선된 코드

// 하트 초기화
        holder.user_heart1.visibility = View.GONE
        holder.user_heart2.visibility = View.GONE
        holder.user_heart3.visibility = View.GONE
        holder.user_heart4.visibility = View.GONE

        // 궁합에 따른 하트 개수 설정
        when (user.user_compat) {
            "A" -> {
                holder.user_heart1.visibility = View.VISIBLE
                holder.user_heart2.visibility = View.VISIBLE
                holder.user_heart3.visibility = View.VISIBLE
                holder.user_heart4.visibility = View.VISIBLE
            }
            "B" -> {
                holder.user_heart1.visibility = View.VISIBLE
                holder.user_heart2.visibility = View.VISIBLE
                holder.user_heart3.visibility = View.VISIBLE
            }
            "C" -> {
                holder.user_heart1.visibility = View.VISIBLE
                holder.user_heart2.visibility = View.VISIBLE
            }
            "D" -> {
                holder.user_heart1.visibility = View.VISIBLE

문제

DetailActivity 페이지에서 뒤로가기를 누르면 FriendFindFragment에서 하트 개수가 유지되지 않고 각 사용자 별로 하트 개수가 1씩 줄어드는 현상이 발견되었다. UserAdapter에서 user.user_compat 값에 따라 하트의 가시성을 설정하는 로직에 문제가 있을 것이라고 추측하였다.


원인 분석

RecyclerView 뷰 홀더 재사용 문제

RecyclerView는 뷰 홀더를 재사용한다. 이전 아이템의 상태(하트의 가시성)가 다음 아이템에 잘못 적용되는 경우가 원인일 수 있다.

하트 가시성 로직 오류

원래 코드에서는 특정 하트만 숨기고 다른 하트는 그대로 두는 방식을 사용했다. 이로 인해 하트의 가시성이 일관적이지 않았고, 이전 상태가 다음 아이템에 영향을 주었다.


해결과정

onBindViewHolder 메서드에서 모든 하트의 가시성을 초기화한 후, user.user_compat 값에 따라 하트의 가시성을 다시 설정했다. 이렇게 하여 각 사용자의 데이터에 따라 하트가 바르게 표시되도록 보장했다.

수정된 코드에서는 먼저 모든 하트를 숨긴 후, 필요한 만큼의 하트만 보이도록 설정했다.
하트의 가시성이 이전 상태에 의존하지 않고, 각 사용자의 데이터에만 의존하도록.


결과

DetailActivity 에서 뒤로가기를 눌렀을 때 FriendFindFragment의 하트 개수가 올바르게 유지되는것을 확인했다. 각 사용자의 user_compat 값에 따라 올바른 수의 하트가 표시되어 일관된 사용자 경험을 제공했다.

결론

RecyclerView의 뷰 홀더 재사용에 대한 중요한 이해를 얻었으며, 관련된 UI 문제 해결에 있어 뷰의 상태 초기화의 중요성을 다시 한 번 확인할 수 있었다.

0개의 댓글