안드로이드 개발 질문/답변
(글 수 45,052)
커스텀 어댑터로 리스트뷰를 수정해서 쓸려고 하는데요..
체크버튼 - 이름/전화번호 - 아이콘 이렇게 4부분으로 나눴습니다
그런데.. 체크를 한뒤에 아래로 스크롤 했다가 다시 위로 올리면 체크했던 부분이 자꾸 사라집니다;;
체크한 위치를 따로 저장하면 될꺼라는 글을 보고
isCheck라는 변수에 위치(position)를 저장해서 실험해도 마찬가지로 체크가 풀려버리네요
(체크는 풀려있지만 삭제 버튼을 누르면 체크했던 항목이 삭제는 됩니다)
체크버튼 - 이름/전화번호 - 아이콘 이렇게 4부분으로 나눴습니다
그런데.. 체크를 한뒤에 아래로 스크롤 했다가 다시 위로 올리면 체크했던 부분이 자꾸 사라집니다;;
체크한 위치를 따로 저장하면 될꺼라는 글을 보고
isCheck라는 변수에 위치(position)를 저장해서 실험해도 마찬가지로 체크가 풀려버리네요
(체크는 풀려있지만 삭제 버튼을 누르면 체크했던 항목이 삭제는 됩니다)
// 리스트뷰 내용 어댑터로 등록
02 |
customListAdapter = new CustomListAdapter(this, R.layout.listsituation, arraylist); |
03 |
|
04 |
listview1 = (ListView) findViewById(R.id.listview1); |
05 |
listview1.setAdapter(customListAdapter); |
06 |
|
07 |
// 휴지통 버튼 클릭시 체크된 항목 삭제 |
08 |
ImageButton wastebasket_btn = (ImageButton) findViewById(R.id.wastebasket_btn); |
09 |
wastebasket_btn.setOnClickListener(new View.OnClickListener() { |
10 |
public void onClick(View v) { |
11 |
for(int i = 0; i < isCheck.size(); i++) { |
12 |
> |
13 |
if((isCheck.get(i)).equals(true)) { |
14 |
arraylist.remove(i); |
15 |
isCheck.remove(i); |
16 |
} |
17 |
} |
18 |
customListAdapter.notifyDataSetChanged(); |
19 |
} |
20 |
}); |
21 |
} |
22 |
|
23 |
class CustomListAdapter extends ArrayAdapter { |
24 |
|
25 |
.... |
26 |
|
27 |
public View getView(final int position, View convertView, ViewGroup parent) { |
28 |
|
29 |
if(convertView == null) { |
30 |
Inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); |
31 |
convertView = Inflater.inflate(R.layout.listsituation, null); |
32 |
} |
33 |
|
34 |
if(ls != null) { |
35 |
CheckBox btn = (CheckBox) convertView.findViewById(R.id.check_btn); |
36 |
btn.setFocusable(false); |
37 |
btn.setClickable(false); |
38 |
|
39 |
if(btn != null) { |
40 |
btn.setChecked(false); |
41 |
CheckBox btn1 = (CheckBox) convertView.findViewById(R.id.check_btn); |
42 |
|
43 |
btn1.setChecked(Boolean.getBoolean(String.valueOf(isCheck.get(position)))); |
44 |
|
45 |
btn1.setOnClickListener(new OnClickListener() { |
46 |
public void onClick(View v) { |
47 |
if((Boolean) isCheck.get(position)) { |
48 |
isCheck.remove(position); |
49 |
isCheck.add(position, false); |
50 |
} else { |
51 |
isCheck.remove(position); |
52 |
isCheck.add(position, true); |
53 |
} |
54 |
} |
55 |
}); |
56 |
btn.setChecked(Boolean.getBoolean(String.valueOf(isCheck.get(position)))); |
57 |
} |
58 |
|
59 |
..... |
60 |
|
61 |
} |
62 |
return convertView; |
63 |
} |
이렇게 저렇게 해보고는 있는데 도저히 모르겠습니다
그리고 여러항목을 체크한 뒤에 삭제 버튼을 누르면 전부다 지워지지 않고 반만 지워집니다 ㅜㅜ
답변 좀 부탁드리겠습니다~




이런 내용이 나오면 항상 말씀을 드리는데...
리스트는 뷰를 재활용하는 특성이 있습니다.
getView에 넘어오는 convertView는 null일수도 있고 재활용되는 View일수도 있습니다.
getView에서는 반드시 position을 기준으로 데이터를 채워넣고 뷰를 관리해야 합니다.
즉, 체크박스를 건들면 어떤 포지션에서 체크가 true혹은 false다... 이런걸 반드시 관리해야 하구요...
getView에서 앞서 관리했던 체크 여부를 가지고 체크박스의 체크를 그리느냐 마느냐를 결정해야합니다.