해당 글은 Recyclerview의 Adapter를 ListAdapter로 구현하다가 고생한 내용입니다.
앱을 만들다가 Recyclerview의 Adapter를 ListAdapter로 구현했고, 스크롤하여 뷰를 그릴때마다 onBindViewHolder가 호출이 되길래, DiffUtil.ItemCallback의 areItemsTheSame과 areContentsTheSame이 잘못 구현이 된 줄 알고 착각하고 하루를 날렸다..
원래 Recyclerview는 스크롤 할때 가려지는 뷰를 재활용하여 새로운 뷰를 그리는 형식이다. 따라서 스크롤 시 onBindViewHolder가 호출이 되어 뷰를 그리는것은 당연한 일이다.. 하지만 나는 areItemsTheSame과 areContentsTheSame에서 비교하고 똑같은 뷰는 그리지 않는다는 잘못된 생각을 가지고, 왜 뷰를 다시 그리는가에 대해 하루종일 고민했다.
areItemsTheSame과 areContentsTheSame에서 비교하고 새로운 데이터만을 반영하는것은 맞지만, 결국에 뷰를 그릴때는 onBindViewHolder가 호출이 되는것이 맞다는 결론에 도달했다...
이러한 잘못된 생각에 도달했던건 다른 화면의 ListAdapter로 구현된 Recyclerview에서 onBindViewHolder이 호출이 되지 않았기 때문인데, 이유는 NestedScrollView로 감싸져있었기 때문이었다. Recyclerview가 NestedScrollView로 감싸져있으면 onBindViewHolder에 로그를 찍어도 로그가 출력이 되지 않았었다... 아마도 Recyclerview가 스크롤 되는것이 아닌 NestedScrollView가 호출되는것으로 인식되기 때문인것 같았다.. 저말고 다른분들은 이런 착각 안하시기를 바랍니다... 이래서 뭐든지 동작원리를 잘 깨달아야 하는가 봅니다.
'안드로이드 > 삽질주의' 카테고리의 다른 글
| 난독화 필수(?) 제외 목록(지속 업데이트 예정) (0) | 2023.03.03 |
|---|---|
| 안드로이드 TTS(텍스트 음성 변환) 음성인식 문제 해결 (0) | 2022.02.09 |