ListView 에 Button 이 여러 개 있을 때 어떻게 해야 할까?
Button 각각에게 다른 리스너를 넣어주고 싶다면?
Button에 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일때만 해주는 이유가 재활용 할 때도 그 버튼에 계속 리스너가
등록되어 있기 때문에 다시해줄 필요가 없기 때문이다.
이는 간단한 방법이고, 좀 더 복잡한 커스텀 UI를 구현할 경우
Compound Widget을 구현하는 것이 좋다.
'IT_Programming > Android_Java' 카테고리의 다른 글
[펌_Android] 어플 종료에 대한 실험 + @ (0) | 2012.03.19 |
---|---|
Android Thread Constructs: Comparisons (0) | 2012.03.12 |
[펌] 안드로이드 뷰 캡슐화 전략 - TabView ( TabHost ) (0) | 2012.03.07 |
Android's Application Object as a "Singleton" (0) | 2012.03.06 |
[펌] 안드로이드 전역 변수 사용하기! (android global variable) (0) | 2012.03.06 |