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

listview checkbox 일부만 삭제가 됩니다.

0 추천
@Override
						
public void onClick(DialogInterface dialog, int which)
 {
						
	for(int i=0; i<arrList.size(); i++)
       {
	//정보삭제

	test = (RelativeLayout) listView.getChildAt(i);
	check = (CheckBox) test.getChildAt(1);
	Log.e("체크확인", "test : "+check.isChecked());
	if(check.isChecked())
        {
          String delstr = arrList.get(i);							
          delete_info(delstr);
	  arrList.remove(arrList.get(i));
	 }
	check.setChecked(false);
	adapter.notifyDataSetChanged();
	}//for문끝
}

 

체크박스로 멀티초이스를 이용하여 리스트에 있는 항목들을 삭제하려고 합니다.

개별적으로 1개씩 선택해서 지울 땐 잘 지워지는데, 2개 이상 선택해서 삭제하려고 하면, 

삭제 되는 항목이 있고, 삭제 되지 않는 항목이 있습니다. 똑같이 check상태가 true인데 말이죠..

지금 리스트에 네개의 항목을 새로 만들어서

1 일번

2 이번

3 삼번

4 사번

이런식으로 만들어서 네개 다 선택 한 후, 삭제 했는데 2 이번/ 4 사번 이 둘만 안지워집니다.

거기서 또 두개를 모두 선택해서 삭제하니, 2번은 삭제 되고 4번은 남아있네요.. 

배열로 따지만 짝수인 애들만 제대로 삭제가 되는 것 같은데, 왜 선택한 녀석들이 정상적으로 삭제 되지 않는지 궁금합니다 ㅠㅠ.. 삭제 기능 자체에는 이상이 없어서 delete_info는 생략했습니다. 조언부탁드립니다..

anci (19,950 포인트) 님이 2014년 3월 7일 질문

3개의 답변

0 추천

로그 상으로는 체크 부분이 정확히 체크한부분만 true로 나오나요??

저도 제대로 하는건지 모르겠지만

arrList에 있는 데이터를 기준으로 리스트뷰를 만든다면

데이터를 삭제한 후 arrList전체를 로그로 다시 출력도 해보시고(제대로 지워졌는지)

데이터가 지워졌다면 리스트뷰.setadapter(adapter)을 다시 주는 방식은 어떠신지요..;

sarang628 (220 포인트) 님이 2014년 3월 7일 답변
감사합니다.지금 다시 3개의 새로운 항목을 만들어서 listView에 뿌려줬습니다. 셋다 체크 안하고 삭제하려고 할 땐 로그에 그 세개가 false로 뜹니다. [정상적으로] 삭제용으로 체크할 녀석들은 true로 뜨고요.
지금 임시로 만든 3개의 항목 모두 체크를 하고 삭제를 한다면 1/2/3모두 삭제가 되어야 하는데 2만 삭제가 안됩니다.
로그를 확인해보니 삭제 된 애들로 추정되는 것만 true로 되어있는 로그가 두개만 찍혀있네요...
0 추천
check.setChecked(false); <- 요거는 삭제하시고
    adapter.notifyDataSetChanged(); <- 요거는 for 문 밖으로 빼보세요
 
이런 점도 있네요 ㅎㅎ 영역 초과시 겟차일드의 문제? ㅎ
 
다른곳에도 댓글을 남겼지만 메일링이 없어서 늦게보실수도 있어서 또 써요 ㅎㅎ

 

초보개발자ㅠ (33,870 포인트) 님이 2014년 3월 7일 답변
초보개발자ㅠ님이 2014년 3월 7일 수정
아 늘 댓글 주셔서 감사합니다 ㅠ.ㅠ..
지금 확인해보니, 다른 에러도 뜨네요.
리스트뷰 밑에 추가/삭제 버튼 두개가 있는데,
추가버튼->다이얼로그팝업->이름/나이 입력->확인->다이얼로그종료->리스트뷰에 입력한 이름/나이 추가 됨.
이 상태에서 바로(뒤로가기 없이) 해당 항목을 체크해서 삭제하면 널 익셉션 오류가 납니다.
java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
이게 없는 배열?을 삭제하려고해서 오류나는거같은데, 추가버튼에서 리스트에 추가했으면 삭제도 바로 되야 하는게 아닌지...ㅠㅠ 어디서부터 꼬인건지 모르겠네유..
0 추천

for문을 리스트 맨뒤 인덱스부터 거꾸로 돌리세요.

리스트에 인덱스 0,1,2,3 순으로 데이터가 있다면

for문 처음은

i=0번 remove(0)이 되고 1,2,3 순으로 데이터가 남고

arrList.size() 는 3

다음 i=1일 때 remove(2)가되고 1,3순으로 데이터가 남고

arrList.size() 는 2

가 되기 때문에 인덱스 0과 2에 해당하는 둘만 지워지는 겁니다.

 

그리고 arrList.size() 는 따로 int형 변수에 담에 사용하시길 추천드립니다.

코딩인헬 (12,150 포인트) 님이 2014년 3월 10일 답변
...