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

listview의 checkbox가 중복처리 됩니다.

0 추천
안녕하세요.

간단하게 edittext로 항목을 추가 하고 삭제하는 listview를 만들고 있는데요,

체크박스가 중복으로 체크 되버리는 현상이 나타납니다.

구글링해보니 getView?를 써야 하는데, 아직 그건 사용하지 않았구요.

순수 listview와 adapter만 사용했습니다.. listView 한번에 7개 정도 보이구요, 그 이상 추가해놓으면 스크롤이 생기는데,

맨 첫번째 항목을 체크하고 스크롤을 내리니 8,9번째쯤에도 체크가 되버립니다.; 뷰의 재사용?문제로 그렇다는데..

어떤식으로 checkBox의 포지션을 접근해야 하는지, 또 체크박스의 체크유무를 나타내야 하는지 궁금합니다.

조언 주시면 감사하겠습니다.^^;
anci (19,950 포인트) 님이 2014년 2월 7일 질문

2개의 답변

+1 추천
 
채택된 답변
리스트뷰를 사용하신다면 row layout 은 한번 inflate 해서 재사용하는 것이 대부분일겁니다. (이렇게 하셨으리라 생각합니다. 그래서 스크롤시 체크하지 않았던 row 의 체크박스가 체크되어서 보이는 것으로 보이고요..)

리스트뷰의 adapter 클래스를 작성하실 때 getView() 부분을 작성하셨을 겁니다. 선택에 대한 데이터(isSelected등)은 뷰와 분리되어야 합니다. 단순하게 CheckBox 자체에 setChecked(true) 이런식으로 처리했다가는 row layout 을 재사용하는 다시 그려지는 row에 영향이 미치거든요..

주의할 점이라면 선택된 것도 하나의 정보이고 이를 별도고 관리하고, getView()는 화면에 그려질 때 자동으로 호출되니 이곳에서 CheckBox가 체크되었던 position의 CheckBox인지 확인하고, setChecked()메소드를 이용해서 표현하면 됩니다.
dante2k (8,390 포인트) 님이 2014년 2월 7일 답변
anci님이 2014년 2월 7일 채택됨
getView 부분은 아직 작성하지 않았습니다. ㅠ;;
추가 버튼을 누르면 editText에 적힌 텍스트값이 List.add(strTotal);
이런식으로 추가되게 구현했구요.
row.xml이나 이런건 사용하지 않았습니다. 레이아웃도 listView와 checkbox만 구현했습니다. 아직 초보라서 정말 간단하게 만든지라..ㅠㅠ
안티푸라면님께서 써주신데로.. 재사용에 대한 문제이니...
ArrayAdapter를 사용하신거라면 내부적으로 구현된 getView() 를 확장하셔서 해결해야 하는 부분입니다.
BaseAdapter를 사용하여 ListView의 Adapter를 구현하는 것을 좀 더 공부하시는 것이 해결책이 입니다.
getView()를 구현하지 않고는 질문의 체크박스 문제는 해결되지 않습니다.

http://developer.android.com/reference/android/widget/ArrayAdapter.html#getView%28int,%20android.view.View,%20android.view.ViewGroup%29

ArrayAdapter또한 BaseAdapter를 구현한 것이니까요..
0 추천
리스트뷰의 재사용문제때문에 그렇습니다.

http://blog.naver.com/PostView.nhn?blogId=hyper1234&logNo=40199427486

참고하세요
안티푸라면 (6,700 포인트) 님이 2014년 2월 7일 답변
...