달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
728x90
반응형

안드로이드 - 리스트뷰 안에있는 여러 버튼 이벤트 처리 

리스트뷰에 버튼이 여러개 있을때 어떻게 해야 할까?
버튼 각각에게 다른 리스너를 넣어주고 싶다면?
버튼에 onClick 리스너에게 그 버튼의 포지션을 알려 주려면?

다음 코드를 보면 해답이 있다.

final OnClickListener myBtn1Listener = new OnClickListener() {
@Override
public void onClick(View v) {
int position = (Integer) v.getTag();
// do something!
}
};
final OnClickListener myBtn2Listener = new OnClickListener() {
@Override
public void onClick(View v) {
int position = (Integer) v.getTag();
// do something here as well!!
}
};

static class ViewHolder {
Button btn1;
Button btn2;
}

getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
ViewHolder holder;
if(v == null) {
holder = new ViewHolder();
v = mInflater.inflate(R.layout.list_item, parent, false);
holder. btn1= (Button) v.findViewById(R.id.button1);
holder. btn2 = (Button) v.findViewById(R.id.button2);

holder.btn1.setOnClickListener(myBtn1Listener); 
holder.btn2.setOnClickListener(myBtn2Listener); 

v.setTag(holder);
}
else {
holder = v.getTag();
}
holder.btn1.setTag(Integer.valueOf(position));
holder.btn2.setTag(Integer.valueOf(position));
}

리스너를 파이널로 만들어서 등록해 주었다. 
new OnClickListener 로 getView에서 해줄 수 있지만 new 를 써서 객체를 생성하게 되면 
시간이 오래 걸린다. 
getView에서는 그런 것을 되도록이면 피하는게 좋다.

리스너 등록은 convertView가 null일때만 해주는 이유가 재활용 할때도 그 버튼에 계속 리스너가 등록되어 있기 때문에 다시해줄 필요가 없기 때문이다.

오로지 그 위치만 정확하게 알려 주면 된다 (setTag를 이용해서)
728x90
반응형
:
Posted by mapagilove