Android: ListView elements with multiple clickable buttons Android: ListView elements with multiple clickable buttons android android

Android: ListView elements with multiple clickable buttons


The solution to this is actually easier than I thought. You can simply add in your custom adapter's getView() method a setOnClickListener() for the buttons you're using.

Any data associated with the button has to be added with myButton.setTag() in the getView() and can be accessed in the onClickListener via view.getTag()

I posted a detailed solution on my blog as a tutorial.


This is sort of an appendage @znq's answer...

There are many cases where you want to know the row position for a clicked item AND you want to know which view in the row was tapped. This is going to be a lot more important in tablet UIs.

You can do this with the following custom adapter:

private static class CustomCursorAdapter extends CursorAdapter {    protected ListView mListView;    protected static class RowViewHolder {        public TextView mTitle;        public TextView mText;    }    public CustomCursorAdapter(Activity activity) {        super();        mListView = activity.getListView();    }    @Override    public void bindView(View view, Context context, Cursor cursor) {        // do what you need to do    }    @Override    public View newView(Context context, Cursor cursor, ViewGroup parent) {        View view = View.inflate(context, R.layout.row_layout, null);        RowViewHolder holder = new RowViewHolder();        holder.mTitle = (TextView) view.findViewById(R.id.Title);        holder.mText = (TextView) view.findViewById(R.id.Text);        holder.mTitle.setOnClickListener(mOnTitleClickListener);        holder.mText.setOnClickListener(mOnTextClickListener);        view.setTag(holder);        return view;    }    private OnClickListener mOnTitleClickListener = new OnClickListener() {        @Override        public void onClick(View v) {            final int position = mListView.getPositionForView((View) v.getParent());            Log.v(TAG, "Title clicked, row %d", position);        }    };    private OnClickListener mOnTextClickListener = new OnClickListener() {        @Override        public void onClick(View v) {            final int position = mListView.getPositionForView((View) v.getParent());            Log.v(TAG, "Text clicked, row %d", position);        }    };}


For future readers:

To select manually the buttons with the trackball use:

myListView.setItemsCanFocus(true);

And to disable the focus on the whole list items:

myListView.setFocusable(false);myListView.setFocusableInTouchMode(false);myListView.setClickable(false);

It works fine for me, I can click on buttons with touchscreen and also alows focus an click using keypad