我有一个带有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");
}
});
答案 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会回收视图,因此在滚动时,从视图的一端掉落的视图将在另一端重用,但使用光标中的新数据。同样,只要您的属性不变,这将非常有用。