listview, recyclerview를 사용하면서 리스트 안에 checkbox를 넣어야 할경우

체크된 상태를 유지를 못하게 된다.

대부분 아래 코드와 같을 거라 본다...

holder.cbFavoritItem.setOnCheckedChangeListener(
CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->

if (holder.cbFavoritItem.isPressed){
onCheckedChange.onViewCheckedChange(isChecked, item)
}
})

이렇게만 해서 리스트를 구현을 하게 되면 나타나는 증상은 체크박스에 체크를 하고 리스트를 아래로 스크롤을 하고 다시 체크한 항목이 있는 위치로 오게 되면 체크가 풀려 있는 현상이 나타나게 되거나 또는 스크롤을 아래로 내리다 보면 체크가 안되어 있는 항목이 체크 되어 있는 등의 증상들이 나타나게 된다. 


holder.cbFavoritItem.setOnCheckedChangeListener(null)

이럴때는 위 코드 처럼 이벤트를 등록하기 전에 null로 초기화 후 이벤트를 등록해 주면 된다.

만약에 리스트에 들어갈 데이터에 특정 상태값에 따라 체크를 바꿔줘야 한다면, 


holder.cbFavoritItem.isPressed

위 코드를 통해서 사용자에 의해 발생된 이벤트인지 여부를 판단해서 처리해 줘야 하는것도 까묵지 말자...


전체 소스중에 해당되는 부분만 추려 보면 아래와 같다.


holder.cbFavoritItem.setOnCheckedChangeListener(null)

if (isFavorit == "T") {
holder.cbFavoritItem.setChecked(true)
}
else{
holder.cbFavoritItem.setChecked(false)
}

holder.cbFavoritItem.setOnCheckedChangeListener(
CompoundButton.OnCheckedChangeListener { buttonView, isChecked ->

if (holder.cbFavoritItem.isPressed){
onCheckedChange.onViewCheckedChange(isChecked, item)
}
})


복사했습니다!