IT_Programming/Android_Java

Android ListView 안에 있는 여러 개의 Button 처리

JJun ™ 2012. 3. 8. 21:53

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을 구현하는 것이 좋다.