오늘 회사에서 하루 종일 삽질한 문제이다.
나 같은 경우는 리사이클러뷰 안에 리사이클러뷰를 사용하는 중복 리사이클러뷰를 구현하고 있었는데,
글라이드 라이브러리를 통해서 이미지를 디스플레이하였다.
그런데 문제는 arrayList에서 0인덱스 자리에만 이미지가 출력되면 좋겠지만,
9인 덱스 자리에서도 똑같은 이미지가 출력되는 것이었다.
아이템의 개수를 증가하니, 9 배수 자리의 인덱스 값에서만 같은
이미지가 계속 출력되는 것이었다.
리사이클러뷰 어뎁터를 갱신할 때는 DiffUtil을 사용하고 있었는데,
혹시나 리사이클러뷰가 두 개이니 각각의 리사이클러뷰를 갱신하지 못해서 생긴 문제인가 생각이 들었다.
(리사이클러뷰 하나만 갱신을 진행하고 있는 상태)
물론 이게 문제가 아니었다.. 이것 때문에 막혀서 시간을 뻐기게 된다.
그러다가 스택오버플로에서 다음과 같은 솔루션을 찾게 되었다.
https://stackoverflow.com/questions/52701438/glide-recyclerview-loading-duplicate-image
이미지 뷰에 전 이미지 리소스가 남아있을 가능성이 있으니,
bitmapDrawable에 null값을 주고,
이미지를 인서트 해라라는 답변도 있었고, (아쉽게도 이 답변은 해결책은 아니었다. 똑같은 문제가 계속 발생)
이 문제를 해결해준 방법은
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
어뎁터 내에 상속된 두 메서드는
DiffUtill을 사용 시에 보통 비교를 통한 상태변화이기 때문에,
정확히 비교가 되지 않고, 중복될 가능성으로 인해
아이템의 값이 유니크하지 않을 수 있다는 가능성이 하나,
그러므로, 고유한 아이디와 타입을 부여해주는 두 오버라이딩된 메서드로 고유한 포지션을 재정의하여
해당 문제를 해결하였다.
이미지는 준비하지 못했지만,
리사이클러뷰 아이템이 원하는 대로 정상적으로 돌아가는 것을 알 수 있었다.
처음 겪어보는 상황이지만, DiffUtil을 사용하면, 생길 수 있는 오류구나로 판단이 된다.
위에 설명은 추측 중 하나이며, 정확하지 않을 수 있다.
아마 저런 이유이지 않을까 생각이 든다.