I have an Android app with a ListView, and each row in the list has a TextView and a Button. What I want to do is add an OnClickListener to each Button in the ListView, but
It's not possible using SimpleCursorAdapter
... you will have to create your own adapter. If you don't want to write a custom Adapter, at least try to enhance the SimpleCursorAdapter with new capabilities. For instance:
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;
}
}
Then, you can do:
SimpleCursorAdapter rows = new YourAdapter(this, R.layout.row_layout, cursor, from, to);
setListAdapter(rows);
Regarding Cristian's answer, one thing I discovered is that getView is called many times, not just when the view is created. So, you will be executing your getView code more frequently than you might think.
If the attributes (e.g. the OnClick listener) you are adding are invariant across all elements in the list, you can override newView instead. It will be called exactly once for each displayed row in the ListView. However, be warned that ListView recycles views, so as you scroll, the ones that drop off one end of the view are reused on the other, but with new data from the cursor. Again, as long as your attributes are invariant, this will work great.