ListView에 Button 등의 위젯들을 포함시켰을 경우,
Button에 setFocusable(false)를 주어 ListView 아이템이 클릭되도록 한다.
여기서 selector를 이용하여 state_pressed 상태 값을 설정했을 때,
ListView 아이템을 클릭하면 Button도 state_pressed = "true" 상태가 되는걸 방지하고자 했다.
1) 미리 준비할 것
ListView와 Adapter의 기본셋팅, 각 버튼의 selector(state_pressed의 true, false 상태)
2) 위젯의 상태 설정하기
Adapter에서...
Button 등의 위젯을 포함할 시 ListView 아이템이 눌리도록 하기 위해,
각 Button에 setFocusable(false)를 설정한다.
ListView 아이템의 눌린 상태를 보여주기 위한 위젯에는 추가로 setClickable(false)를 설정한다.
3) Button의 클릭리스너 설정하기
Adapter에서 생성자를 추가해준 후
private ViewHolder m_viewHolder;
private ArrayList<CommonData> m_alData;
private LayoutInflater m_inflater;
private OnClickListener m_onClickListener;
public CommonBaseAdapter(Context context, ArrayList<CommonData> alData, OnClickListener onClickListener) {
m_alData = alData;
m_inflater = LayoutInflater.from(context);
m_onClickListener = onClickListener;
m_viewHolder = new ViewHolder();
}
Button에 리스너를 설정한다.
m_viewHolder.m_btnFolderDelete.setOnClickListener(m_onClickListener);
Activity에서 setAdapter에 클릭리스너를 포함시켜주고
.setAdapter(new CommonBaseAdapter(m_context, m_alData, m_onClickListener));
onClickListener에서 R.id.btn_folder_delete 를 받아 이벤트를 처리하면 된다.
(이벤트 처리는 Activity에서 해도 되고 Adpater에서 해도 된다.)
case R.id.btn_folder_delete:
break;
4) ListView에 영향을 받지 않는 클래스를 만든다. (원하는 위젯을 상속받아서 만들면 된다.)
public class NoParentPressButton extends Button {
public NoParentPressButton(Context context) {
super(context);
}
public NoParentPressButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setPressed(boolean pressed) {
// If the parent is pressed, do not set to pressed.
if (pressed && ((View) getParent()).isPressed()) {
return;
}
super.setPressed(pressed);
}
}
5) ListView 아이템과 Adapter의 Button을 NoParentPressButton으로 바꿔준다.
m_viewHolder.m_btnFolderDelete = (NoParentPressButton) convertView.findViewById(R.id.btn_folder_delete);
(xml은 생략)
실행해보면 ListView의 아이템과 Button의 이벤트를 각각 처리할 수 있다.
'프로그래밍 > Android' 카테고리의 다른 글
Android System Bar Hide (0) | 2014.11.15 |
---|---|
Android Toast 유틸 클래스 (0) | 2014.11.02 |
Android Actionbar(appcompat_v7) 사용하기 (0) | 2014.11.01 |
Android BaseAdapter (0) | 2014.04.17 |
Android PagerAdapter (0) | 2014.04.17 |
댓글