총 게시물 1,102건, 최근 0 건 안내 RSS 글쓰기
다음글  목록 글쓰기
[TIP&TECH]

리스트뷰에서 스위치,체크박스사용시

글쓴이 : 에찌 날짜 : 2017-05-08 (월) 11:25 조회 : 986
글주소 : http://www.androidside.com/B56/33019
 
  베리칼 공식 홈페이지
세계 최대 전자 부품 인벤토리 보유. 무료 배송 및 100% 보증, 베리칼
www.verical.com/ko/
  스위치 티몬
스위치, 50% 할인, 공포와 웃음이 동시에! 코믹 반전 공포스릴러! 대학로!
www.ticketmonster.co.kr
  스위치 구입 디지키
즉시구입가능 및 최소주문량없음. 스위치 주문. 당일 배송!
www.digikey.kr
신청하기


현재 리스트뷰에 스위치를 넣어놨습니다.
리스트뷰 또는 스위치를 클릭하면 스위치는 잘 체크되고 잘 체크해제가 되었습니다.

그런데 다른 액티비티에 갔다가 오면 제가 체크하지않은 스위치가 체크되고 체크한 스위치는 체크가 되지않더군요.

(체크된 상태는 Preference에 저장하고있습니다.)

등록된 아이템, holder, position 모두 final 로 선언되어있어 문제가 되지않을 것이라 생각했는데...
스위치의 setOnCheckedChangeListener에서는 holder와 position이 서로 다르게 바라보고있었습니다.
(holder 의 TextView와 position으로 가져온 holder의 TextView에 넣을 text가 달랐습니다.)

이유는 잘 모르기에 결론만 우선 말씀드리도록 하겠습니다.

	holder.settingName.setText(customListItem.getTextView());
holder.settingValue.setChecked(customListItem.isCheckBox());
holder.settingValue.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

if(isChecked){
editor.putBoolean(customListItem.getCheckbox_name(), true);
editor.commit();
// Toast.makeText(mContext, customListItem.getTextView() + " ON", Toast.LENGTH_SHORT).show();

} else {
editor.putBoolean(customListItem.getCheckbox_name(), false);
editor.commit();
// Toast.makeText(mContext, customListItem.getTextView() + " OFF", Toast.LENGTH_SHORT).show();
}
}
});


위와 같이 하도록 하면 저와 같은 문제가 야기될 수 있습니다.

하지만

        holder.settingValue.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

if(isChecked){
editor.putBoolean(customListItem.getCheckbox_name(), true);
editor.commit();
// Toast.makeText(mContext, customListItem.getTextView() + " ON", Toast.LENGTH_SHORT).show();

} else {
editor.putBoolean(customListItem.getCheckbox_name(), false);
editor.commit();
// Toast.makeText(mContext, customListItem.getTextView() + " OFF", Toast.LENGTH_SHORT).show();
}
}
});

holder.settingName.setText(customListItem.getTextView());
holder.settingValue.setChecked(customListItem.isCheckBox());

이렇게 하면 문제는 사라지더군요..

단순히 setChecked를 setOnCheckChangeListener 아래로 내렸을 뿐인데 말이죠.....

저와 같은 문제가 생기신 분은 이렇게 한번 해보셔요 문제가 해결될 수도 있습니다

그리고 혹시나 왜 저런지 아시는 분은 답글로 남겨주셔요 궁금하네요.. 




추천 버튼을 클릭하면 추천한 자와 추천받은 자 모두에게 포인트가 지급됩니다.

안사 이쁜이 2017-05-08 (월) 11:25
축하드립니다. ;)
에찌님은 안사 이쁜이에 당첨되어 1 포인트 지급되었습니다.
OSKiller 2017-05-08 (월) 11:37
저는 리스트에서 체크 박스 사용할 때 체크체인지를 사용하지 않고 클릭리스너를 사용합니다
체크체인지는 getview/bindview에서 단순히 setChecked를 호출 하는것만으로도 동작 할수 있기때문에
실제 사용자가 클릭한 이벤트만 받아서 처리 합니다
댓글주소
박준규 2017-05-08 (월) 11:59
당연히 2번이 제대로 수행됩니다.

setChecked 함수를 호출하면 onCheckedChangeListener가 호출되는데

1번의 경우 리스너가 없기때문에 아무 일도 수행하지 않습니다.
리스너가 호출 안됐다. = editor.putBoolean.commit 이 수행되지 않았다 = Preference가 변경되지 않았다. = 화면과 실제 데이터가 다르다.

반면에 2번은 setChecked 호출 전에 리스너가 등록되어있으니 리스너가 호출되겠지요.
댓글주소
chan1 2017-07-20 (목) 11:40
리스트 뷰는 뷰가 지속적으로 재활용 되기 때문에 그렇습니다.
리싸이클러 뷰 같은 경우는 이런 문제가 없지만
브레이크 포인트를 잡고 디버깅 해보시면 아실겁니다.
getView 메소드 안에서 position 과 item 의 상태를 확인해 보시기 바랍니다.
체크 박스같은 경우는 뷰를 리턴해 주기전에 막아줘야만 합니다.
이는 체크된 포지션이 뷰가 재사용 되면서 계속 변경되기 때문입니다.
메서드가 호출되어 그려낼때 재사용 되지 못하도록 변경 불가능한 데이터가 있어야 합니다.
댓글주소
다음글  목록 글쓰기

총 게시물 1,102건, 최근 0 건 안내 RSS
번호 분류 제목 글쓴이 날짜 추천 조회
1102 TIP&TECH  리스트뷰에서 스위치,체크박스사용시 4 에찌 05-08 0 987
1101 TIP&TECH  뷰(RecyclerView/...)에 Max Height 주기/[Android] 김병희라고요 04-26 0 748
1100 TIP&TECH  TabLayout ClickEvent 에찌 04-21 0 723
1099 TIP&TECH  현재 사용하고 있는 어플 foreground인지 backgroun… 4 에찌 04-14 1 1220
1098 TIP&TECH  안드로이드 Drawble 에 해상도 마다 이미지를 … 1 에찌 04-14 0 843
1097 TIP&TECH  fragment 에서 ButterKnife 사용 시 resource가져올 때… 1 에찌 04-12 0 657
1096 TIP&TECH  Youtube 및 facebook 동영상 업로드 할때 1 희망과꿈을 03-28 0 865
1095 TIP&TECH  google service lib 가져올 때 3 에찌 03-20 2 980
1094 소스코드  CentralRV 프로젝트 - RecyclerView 가로/세로 가운… 1 김병희라고요 01-30 1 1745
1093 TIP&TECH  번개검색 시스템/[Android] 2 김병희라고요 12-29 2 1380
1092 TIP&TECH  RecyclerView 특정 포지션으로 스크롤 - smoothScroll… 1 김병희라고요 12-12 1 1377
1091 강좌  왕앱따 107. 자바/C++ 파일읽기 속도 비교/[Androi 김병희라고요 11-26 0 1532
1090 강좌  왕앱따 106. C++ 동영상 강좌/[Android] 김병희라고요 11-23 0 1656
1089 자료  박근혜를 탄핵할 수 있는 어플을 만들었어요. 3 씨드래곤아트 11-23 0 1971
1088 소스코드  AOSP용 한글 키보드 입력키 엘카이저 11-17 1 1477
1087 강좌  addDrawerListener, setDrawerListener(deprecated)/[Android] 김병희라고요 11-02 2 1852
1086 강좌  왕앱따 103. 아이콘 반복클릭 테스트/[Android] 김병희라고요 11-01 0 1457
1085 강좌  왕앱따 100. 안드로이드 왕초보의 앱개발 따라… 김병희라고요 10-29 0 1790
1084 강좌  DoubleDrawer(5) - 좌우 모두 NavigationView 사용/[Andro… 김병희라고요 10-27 0 1325
1083 강좌  DoubleDrawer(4) - 소스 오류(아이콘 토글 문제) 수… 김병희라고요 10-27 0 1171
 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  다음  맨끝
 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기