예들들면 다음과 같은 listview를 만들려고 합니다.

listview 위에는 아래 소스와 같이 adapter와 holder class를 사용해서 row를 반복 시키고 있습니다.

row 안에는 버튼들도 있구요.

문제는 현재와 같이 getview 안에서 holder.button에 이벤트를 주면 그 버튼을 클릭시 각각 다른 이벤트 결과물이 나와야하는데 안나온다는 점입니다.

버튼을 눌렀을때,
각각 row의 position을 받아오면 좋겠지만,

로그캣을 보면 가장 마지막 row에 있거나 아니면 버튼 이외의 곳을 눌러 포커싱된 row의 position을 받아온다는 점입니다..


혹시 이 button에 대한 이벤트를 각각 줄수 있는 방법을 아시는 분은 답변 부탁드립니다.



  1. package com.babukuma.android.test;  
  2.   
  3. import static com.babukuma.android.test.Main.LOG_TAG;  
  4. import android.app.ListActivity;  
  5. import android.content.Context;  
  6. import android.os.Bundle;  
  7. import android.util.Log;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.view.ViewGroup;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.BaseAdapter;  
  13. import android.widget.Button;  
  14. import android.widget.TextView;  
  15.   
  16. public class ListViewWithButton extends ListActivity {  
  17.  @Override  
  18.  protected void onCreate(Bundle savedInstanceState) {  
  19.   super.onCreate(savedInstanceState);  
  20.   
  21.   setListAdapter(new ListAdapterWithButton<String>(this, getResources()  
  22.     .getStringArray(R.array.list_test_menus)));  
  23.  }  
  24.   
  25.  class ListAdapterWithButton<T> extends BaseAdapter {  
  26.   private final LayoutInflater mInflater;  
  27.   private final T[] array;  
  28.   
  29.   public ListAdapterWithButton(final Context context, final T[] array) {  
  30.    this.mInflater = LayoutInflater.from(context);  
  31.    this.array = array;  
  32.   }  
  33.   
  34.   @Override  
  35.   public int getCount() {  
  36.    return array.length;  
  37.   }  
  38.   
  39.   @Override  
  40.   public T getItem(int position) {  
  41.    return array[position];  
  42.   }  
  43.   
  44.   @Override  
  45.   public long getItemId(int position) {  
  46.    return position;  
  47.   }  
  48.   
  49.   class ViewHolder {  
  50.    TextView label;  
  51.    Button button;  
  52.   }  
  53.   
  54.   @Override  
  55.   public View getView(final int position, View convertView,  
  56.     ViewGroup parent) {  
  57.    ViewHolder holder;  
  58.   
  59.    if (convertView == null) {  
  60.     convertView = mInflater  
  61.       .inflate(R.layout.list_with_button, null);  
  62.   
  63.     // Creates a ViewHolder and store references to the two children  
  64.     // views  
  65.     // we want to bind data to.  
  66.     holder = new ViewHolder();  
  67.     holder.label = (TextView) convertView  
  68.       .findViewById(R.id.list_with_button_text);  
  69.     holder.label.setOnClickListener(new OnClickListener() {  
  70.      @Override  
  71.      public void onClick(View v) {  
  72.       Log.d(LOG_TAG, "label click position=" + position);  
  73.      }  
  74.     });  
  75.     holder.button = (Button) convertView  
  76.       .findViewById(R.id.list_with_button_button);  
  77.     holder.button.setOnClickListener(new OnClickListener() {  
  78.   
  79.      @Override  
  80.      public void onClick(View v) {  
  81.       Log.d(LOG_TAG, "button click position=" + position);  
  82.      }  
  83.     });  
  84.   
  85.     holder.label.setText(array[position].toString());  
  86.     holder.button.setText(array[position].toString());  
  87.   
  88.     convertView.setTag(holder);  
  89.    } else {  
  90.     holder = (ViewHolder) convertView.getTag();  
  91.    }  
  92.   
  93.    return convertView;  
  94.   }  
  95.   
  96.  }  
  97. }