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

getChildAt(i) 를 사용시 문제점이 발생합니다.

0 추천

 

 
 

안녕하세요. 아래와 같은 방식으로 리스트뷰의 항목들중 원하는 것만 체크해서 삭제하는 기능을 구현하고 있습니다.

 test = (RelativeLayout)listView.getChildAt(i); //여기서 listView는 현재 보여지는 listview.

check_stu = (CheckBox) test.getChildAt(1);

Log.e("체크확인","test : "+ check_stu.isChecked());
 
if문으로 체크된 녀석만 삭제하는 식으로.,.그렇게 하는데, 문제점이 크게 두가지가 발생했습니다.
 
1.
위의 그림을 보시면. 리스트 항목들의 갯수는 굳이 정해져있지 않고 사용자가 추가 삭제 하면서
가변적으로 변하는데요, 지금은 전체 갯수가 13개라고 가정하겠습니다.
리스트뷰에서 0개부터 시작해서 하나 하나씩 추가 하고 10번째 [리스트뷰에서 스크롤하지 않고 보이는 영역]까지는
체크하면 삭제가 잘 됩니다. 문제는 그 뒤부터인데요, 10번째까지 이상이 없어서 11번째를 추가하고 
(추가버튼이 따로있습니다) 스크롤 한 후, 체크박스로 삭제하려고 하면 에러가 뜹니다.
 
check_stu = (CheckBox) test.getChildAt(1); <-이부분에서 널 포인트 익셉션 에러가 발생합니다.
정확하게 왜 그런건지는 모르겠지만, 체크박스값을 찾지못하는것 같은데 혹시 리스트뷰 영역에 벗어나게 되서 그런건지..
 
2. 
위의 상태에서 스크롤로 리스트뷰를 내리면 체크박스가 중복체크 되는 경우가 발생합니다..
검색해보니 view의 재사용?문제라는데요.. 총체적 난국입니다-_-;;
일단 1번이라도 해결 할 수있으면 좋겠는데, 저 방식 말고 다른 방식으로 checkbox와 리스트를 구현 할 수있는 방법에 대해 조언 좀 부탁드립니다. 긴글 읽어주셔서 감사합니다.
 
 
anci (19,950 포인트) 님이 2014년 6월 9일 질문

1개의 답변

+1 추천
1. 뒤에서부터 삭제하시길 앞에서부터 삭제하면 size 값이 줄어들므로 오동작할 우려가있음

 

2. 뷰재사용문제가 맞고 체크한아이템은 뷰에서 그려줄때 판단해서 체크한것은 체크된것으로 아닌것은 체크안된것으로

해줘야 댐
건방진프로그래머 (26,630 포인트) 님이 2014년 6월 10일 답변
답변 감사합니다..
arrList.size는 전체 인원인데, 이 쪽도 전에 해결받아서 작성한지라..;
뒤에서부터 삭제해야 한다는게 아래 for문과 같은지요? 현재 소스에 적용한겁니다
for (int i = arrList.size() - 1; i >= 0; i--)
{
    test = (RelativeLayout)listView.getChildAt(i);
        check_stu = (CheckBox) test.getChildAt(1);
    if (check_stu.isChecked()) //만약 체크 되어있다면 지우기
    {
         //블라블라
         }
...