I have trouble with a ListView
. Its items (rows) have an ImageButton
. The ImageButton
has android:onClick
set, so this onClick
event is working, but click on row doesn't work.
If I remove the ImageButton
from the row item, click on row works (ListView
has correct onClick
listener). How can I fix it? I need onClick
event when the user clicks on the ImageButton
, and the standard click event when the user selects the row (not click the ImageButton
but click the row).
My ListView:
<ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/restaurants_list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:divider="@color/list_devider" android:dividerHeight="1dp" android:cacheColorHint="@color/list_background" />
Unfortunately,
android:focusable="false" android:focusableInTouchMode="false"
doesn't work for ImageButton
.
I finally found the solution here. In your layout xml for those items, add
android:descendantFocusability="blocksDescendants"
to the root view.
It works perfectly for a ListView
that has ImageButton
s. According to official reference, blocksDescendants
means that the ViewGroup
will block its descendants from receiving focus.
You can use a custom adapter for your listView (if you haven't already). And there, in the getView(int position, View inView, ViewGroup parent)
method of the adapter do something like this:
@Override public View getView(int position, View inView, ViewGroup parent) { View v = inView; ViewHolder viewHolder; //Use a viewholder for sufficent use of the listview if (v == null) { LayoutInflater inflater = (LayoutInflater) adaptersContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(R.layout.list_item, null); viewHolder = new ViewHolder(); viewHolder.image = (ImageView) v.findViewById(R.id.ImageView); v.setTag(viewHolder); } else { viewHolder = (ViewHolder) v.getTag(); } ..... viewHolder.image.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //Click on imageView }i }); v.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //Click on listView row } }); ..... return (v); }
See here if you need help creating your custom adapter.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With