2011년 1월 4일 화요일

android ListView CheckBox onListItemClick

영어 실력이 안드로메다인지라 제목에 그냥 키워드를 나열했군요...ㅡㅡ;;;

이 글의 진정한 제목은
CheckBox를 포함한 ListView의 onListItemClick 발생시키기다.

ListView의 Item에 CheckBox가 포함된 경우 onListItemClick이벤트가 발생하지 않는다.
그건 아마도 CheckBox가 이벤트를 잡수시는 엄청난 포스가 있으신듯하다.

그리하여 결국 내가 선택한 방법은 CheckBox를 클릭할때 ListView의 onListItemClick를 강제로 발생시키는 방법이다.
머 이런 경우는 웹에서도 종종 발생하는 경우이기도 하다.
여러 컴퍼넌트에서 이벤트가 발생하면 뜻하지 않은 이상한 결과가 발생하는건 당연한듯하다.

결론은(클래스명도 안드로메다임을 알아주시길...)

import android.view.View;
import android.widget.ListView;
public class ListInCheckItemClickAdapter implements View.OnClickListener {
 ListView listView;
 int position;
 int id;
 public ListInCheckItemClickAdapter(ListView listView, int position, int id){
  this.listView = listView;
  this.position = position;
  this.id = id;
 }

 @Override
 public void onClick(View v) {
  // TODO Auto-generated method stub
  listView.performItemClick(v, position, id);
 }
}

여기서 핵심은
listView.performItemClick(v, position, id);
이벤트를 강재로 발생시키는 함수는 perform으로 시작한다.

그렇다면 만들어논 클래스를 사용하는 방법은
ListView에 연결된 BaseAdapter의 getView에서 Item생성시 CheckBox에 clickEvent로 이 객체를 연결하는 방식이다.

checkBox.setOnClickListener(new ListInCheckItemClickAdapter(getListView(), position, checkBox.getId())); 사용법은 간단하다.
getListView()는 아래 글중에 한번 언급한듯 하다.
ListActivity를 상속받은 경우 ListView를 가져오는 함수다.

참고로 BaseAdapter는 inner class로 구현했다.

사실 BaseAdapter도 자주 쓰는 부분 getCount, getItem, getItemId, getView등의 중복코딩이 있어 별도로 구현한 Adapter를 사용한다.
내 경우는 반복코딩이나 무한 삽질을 워낙 싫어하다 보니 구현해서 사용하지만 개발자마다 취향이 있어 포스팅까지는 필요없다고 생각한다.

#SCMInno #에스씨엠이노 #WEBDeK

댓글 없음: