Android:为ListView中的每个项添加事件侦听器

时间:2010-10-03 22:16:53

标签: android event-handling android-layout

我有一个带有ListView的Android应用程序,列表中的每一行都有一个TextView和一个Button。我想要做的是为ListView中的每个Button添加一个OnClickListener,但我无法弄清楚如何获得对每个Button的某种引用......任何人都可以给我一个提示吗?

这是我绑定到ListAdapter的XML:

<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");
    }
}); 

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

关于Cristian的回答,我发现有一件事是getView被多次调用,而不仅仅是在创建视图时。因此,您将比您想象的更频繁地执行getView代码。

如果要添加的属性(例如OnClick侦听器)在列表中的所有元素中都是不变的,则可以改为覆盖newView。对于ListView中的每个显示行,它将被调用一次。但是,请注意ListView会回收视图,因此在滚动时,从视图的一端掉落的视图将在另一端重用,但使用光标中的新数据。同样,只要您的属性不变,这将非常有用。