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

recyclerview 일부 데이터 중복 문제

0 추천

예를 들면 음악 리스트를 나타내는 recyclerview가 있다고 치면

번호. 제목 / 가수 / 국내ㆍ해외 -> recyclerview의 item

1. 아무노래 / 지코 / 국내

2. 그때 그 아인 / 김필 / 국내

3. 2002 / Anne-Marie / 해외

4. Blueming / 아이유 / 국내

5. bad guy / Billie Eilish / 해외

 

이런식으로 5개의 리스트가 있는데

 

1. 아무노래 / 지코 / 국내

2. 그때 그 아인 / 김필 / 해외

3. 2002 / Anne-Marie / 해외

4. Blueming / 아이유 / 국내

5. bad guy / Billie Eilish / 해외

 

위와 같이 표시된것 처럼 한 리스트에 한 데이터만 잘못 표시 되는 경우가 있습니다.(스크롤 하지 않습니다.)

이런 경우에는 어떤 것이 문제일까요?로그로 확인해보면 데이터가 잘못 저장되고 있지는 않았습니다.

예는 이렇게 들었지만 제가 하는 것은 수시로 데이터가 변경되는 것을 표시해 주어야하기에 주기적(0.5sec)으로 adapter.notifydatasetchanged();를 합니다. 변경된 position의 값만을 notify해주는게 좋다는것은 알지만 대부분의 데이터가 수시로 변경되기 때문에 전체 데이터를 notify해줍니다.

하나에 item에 표시되는 데이터가 십여개 되는데 하나의 데이터만이 꼭 저렇게 엉뚱하게 나오기도 하네요.

주기적인 갱신으로 금방 원래의 데이터로 표시되지만 잘못 표시되었을 경우 한눈에 보이기 때문에 문제입니다.

 

혹시 저와 같은 문제가 일어나셨던 분이 계실까요?해결 방법을 알고 싶습니다.

빈길 (1,270 포인트) 님이 2020년 4월 2일 질문

1개의 답변

0 추천
recycler view는 스크롤 할 때 view holder를 재사용하는데요, 아마 재사용한 view holder에 "해외"라고 그전 데이터가 바인딩 되어 있었을 것이고, 그때그아인/김필 데이터 바인딩 할 때 "국내/해외" 항목이 null이었거나 기타의 이유로 제대로 바인딩이 안 되었을 겁니다. 바인딩할 항목이 없을 때에 뷰를 그대로 두면 안되고 빈 텍스트로 초기화를 하거나 해야 다른 데이터 바인딩시 설정된 값이 보이는 이슈를 해결할 수 있습니다.
원더풀코딩라이프 (560 포인트) 님이 2020년 4월 4일 답변
해당 항목이 null이 아니었다면 기타의 이유는 어떤것들이 있을까요?
데이터는 백그라운드에서 저장되고 있어서 null이 아닌것은 확실합니다.
혹시 모를 문제가 발생할까 try ~ catch문으로 null일 경우에는 아무 데이터도 표시되지 않게 했거든요.


public void onBindViewHolder(final Viewholder holer, final int position){
String title = "";
String country = "";
int modePosition = 0;

if(holder.getAdapterPosition() == RecyclerView.NO_POSITION) return;
modePosition = holder.getAdapterPosition();

try{
title = map.get(modePosition).get("TITLE");
country = map.get(modePosition).get("COUNTRY");
}catch(NullPointException e){

}

holder.titleText.setText(title);
holder.countryText.setText(country);
}
...