님의 증상이 발생할 수 있는 경우를 말씀드리면, 리사이클러뷰 어댑터(어댑터라고 부를게요)는 뷰홀더를 화면에 보이는 갯수 + 알파만큼만 생성을 하고 스크롤시에 재사용을 합니다. 따라서 스크롤이 발생할 때는 기존에 이미 생성되었던 뷰홀더가 사용되므로, 이전에 뷰홀더에 설정했던 값들이 남아 있게 됩니다. 님의 경우는 Handler까지 사용했기 때문에, 원하지 않은 포지션에 있는 뷰홀더의 내용이 갱신될 수 있습니다.
따라서 외부에서 어댑터에 필요한 데이터를 먼저 다 가져오고 난 다음에 어댑터를 갱신하세요.
어댑터에 사용하는 데이터는 flag를 하나 두어서 Handler사용했던 msg.arg를 대체하시던가, 아니면 클래스를 두개 나누어서 멀티뷰타입을 사용하셔도 됩니다.
flag를 사용할 경우,
public class ListItem {
private final int itemType;
private final title;
private fianl memo;
// Constructor, Getters 생략
}
멀티뷰타입을 사용할 경우, (ViewHolder가 두개 필요해서 코드는 많아집니다만, 상황에 맞게 사용하면 코드가 좀 더 깔끔해 질 수 있습니다.)
public abstract class ListItem {
public abstract int getViewType();
// Constructor, Getters 생략
}
public class ConsumableItem extends ListItem {
private final title;
// Constructor, Getters 생략
@Override
public int getViewType() {
return R.layout.item_consumable;
}
}
public class MemoItem extends ListItem {
private final memo;
// Constructor, Getters 생략
@Override
public int getViewType() {
return R.layout.item_memo;
}
}