본문 바로가기
프로그래밍/Android

Android ListView 아이템과 Button 이벤트를 각각 처리하는 방법

by CaffeLatte 2014. 11. 2.

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

댓글