물에 살고싶은 개발자

[Custom ListView] ViewHolder와 CheckBox 처리 예제 본문

Android

[Custom ListView] ViewHolder와 CheckBox 처리 예제

돼지사랑 2017. 10. 10. 17:58

어떻게 해야할까 구글링과 아이디어를 짜내다가 다음번에 까먹으면 또 이렇게 시간낭비할거같아서 기록해둠


일단 뷰홀더처리


지금은 체크박스만 할거니까 심플하게ㅇㅇ


ViewHolder.java

public class ViewHolder {
CheckBox checkBox;
}


그리고 리스트뷰에서 쓸 아이템 클래스에 멤버변수 하나 추가해주자


Item.java 

boolean isChecked = false;

참고로 위에 둘다 getter,setter는 생략함



Adapter.java 의 getView에서

item = fridgeItems.get(position);
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.item, null);

viewHolder.setCheckBox((CheckBox) convertView.findViewById(R.id.checkBox));
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}

//체크박스의 기본 이벤트리스너 제거
viewHolder.checkBox.setClickable(false);
viewHolder.checkBox.setFocusable(false);
//체크상태 설정
viewHolder.checkBox.setChecked(item.isChecked());


이렇게까지 해주면 체크박스를 위한 홀더는 기본적으로 세팅이 끝난다.

약간 설명을 하자면, 후에 체크된녀석들을 핸들링하기 위해 독자적 로직으로 사용하기 위해 체크박스에 기본적으로 붙어있는 리스너를 풀어주고

홀더에 있는 체크박스로 체크세팅을 위에서 멤버변수에 추가해준 체크변수로 핸들링해준다.


사족을 좀 달자면 사실 이 로직을 사용하기전까지 아이디어 쥐어짜내느라 삽질한시간이 한시간쯤 되는데

그 이유가.. 홀더를 이용하게되면, 아이템들과는 다르게 어떤놈이 어떤놈인지 찾을수가 없다.

그래서 아이템 객체에다가 boolean 변수를 두고 Adapter클래스의 position 매개변수를 이용해서 

핸들링해주면 고민~~~해결!! 되는셈이다.




아무튼 이제 리스트뷰의 클릭리스너를 설정해주자.


액티비티 클래스에서 리스너를 추가해준다. (나는 개인적으로 인터페이스 추가하고 this로 리스너 추가하는 방식을 선호한다)

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.e("onItemClick", "클릭->"+position);
adapter.checkedConfirm(position);
adapter.notifyDataSetChanged();
}


요렇게 해주고 어댑터에서 checkedConfirm() 매서드를 추가해준다

public void checkedConfirm(int position) {
Item item = items.get(position);
item.setChecked(!item.isChecked());
}


이렇게 하면 체크박스에 체크된녀석들을 사용하기 위해 홀더에서 찾지않고 item에서 찾아서 써주면 된다




참고링크 : https://stackoverflow.com/questions/10911361/how-to-get-selected-list-items-from-a-listview-with-checkbox-and-custom-adapter

http://arabiannight.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9CAndroid-Custom-ListView-CheckBox-%EB%AA%A8%EB%91%90-%EC%84%A0%ED%83%9D-%ED%95%98%EA%B8%B0




Comments