2010-10-03 55 views
3

我有一個帶有ListView的Android應用程序,列表中的每一行都有一個TextView和一個按鈕。我想要做的是將一個OnClickListener添加到ListView中的每個按鈕,但我無法弄清楚如何得到每個Button的某種引用......任何人都可以給我一個提示嗎?Android:將事件監聽器添加到ListView中的每個項目

這裏是我的XML綁定到該ListAdapter:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"> 
<TextView 
    android:id="@+id/row_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:textSize="18sp"> 
</TextView> 
<Button 
    android:id="@+id/row_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" /> 
</RelativeLayout> 

而且我想這樣的事情,但它不工作:

SimpleCursorAdapter rows = new SimpleCursorAdapter(this, R.layout.row_layout, cursor, from, to); 
setListAdapter(rows); 
Button button = (Button) getListAdapter().getView(0, null, getListAdapter()).findViewById(R.id.row_button); 
button.setOnClickListener(new View.OnClickListener() { 
    @Override public void onClick(View v) { 
     Log.i(TAG, "clicked"); 
    } 
}); 

回答

11

它使用SimpleCursorAdapter不可能的......你將不得不創建自己的適配器。如果您不想編寫自定義適配器,至少應嘗試使用新功能來增強SimpleCursorAdapter。例如:

public class YourAdapter extends SimpleCursorAdapter{ 

    public YourAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
     super(context, layout, c, from, to); 
    } 

    public View getView(int position, View convertView, ViewGroup parent){ 
     View view = super.getView(position, convertView, parent); 
     Button button = (Button)view.findViewById(R.id.row_button); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override public void onClick(View v) { 
       Log.i(TAG, "clicked"); 
      } 
     }); 
     return view; 
    } 
} 

然後,你可以這樣做:

SimpleCursorAdapter rows = new YourAdapter(this, R.layout.row_layout, cursor, from, to); 
setListAdapter(rows); 
0

關於克里斯蒂安的回答,有一件事我發現是getView叫了很多次,不只是當在創建視圖。所以,你會比你想象的更頻繁地執行你的getView代碼。

如果要添加的屬性(例如,OnClick偵聽器)在列表中的所有元素上都是不變的,則可以改爲覆蓋newView。它將在ListView中爲每個顯示的行準確調用一次。但是,需要警告的是,ListView可以回收視圖,因此當您滾動時,放棄視圖一端的視圖會在另一端重新使用,但是會使用遊標中的新數據。再一次,只要你的屬性不變,這將會很好。