Trying to catch a click on android ListView item: android:descendantFocusability="blocksDescendants" not working

Viewed 34635

This has been addressed in many posts on StackOverflow. The most recommended solution is to set:

android:descendantFocusability="blocksDescendants"

on the root layout of the list item layout. I've done the following.

  • Set android:descendantFocusability="blocksDescendants" on the root list item layout.
  • Called setDescendantFocusability(BLOCK) on the listView, as well as each listViewItem.
  • Set focus=disabled on the ImageButtons

However when one of the child ImageButtons is clicked, I can't get any listeners on the ListView or ListView Items to fire.

Below is the "template" I am using to render a list item.

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/reminderItem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:descendantFocusability="blocksDescendants"
        android:padding="0dp">

    <RelativeLayout
            android:id="@+id/topPartOfReminder"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="10dp">

        <LinearLayout
                android:layout_alignParentLeft="true"
                android:layout_alignParentTop="true"
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:id="@+id/textLayout">

            <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">
                <TextView
                        android:fontFamily="sans-serif-light"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="22sp"
                        android:text="10:00"
                        android:textStyle="normal"
                        android:id="@+id/textTime"/>
                <TextView
                        android:fontFamily="sans-serif-condensed"
                        android:textSize="9sp"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="AM"
                        android:paddingLeft="2dp"
                        android:textStyle="normal"
                        android:id="@+id/textAmPm"/>
                <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textAppearance="?android:attr/textAppearanceMedium"
                        android:text=" - "
                        android:id="@+id/textDivider"/>
                <TextView
                        android:fontFamily="sans-serif-light"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:textSize="16sp"
                        android:text="March 26"
                        android:id="@+id/textDate"/>
            </LinearLayout>
            <TextView
                    android:fontFamily="sans-serif-light"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textSize="12sp"
                    android:text="Blah blah blah blah"
                    android:id="@+id/textDescription"/>
        </LinearLayout>

        <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_toRightOf="@+id/textLayout"
                android:gravity="right">

            <ImageButton
                    style="@style/HorizontalButton"
                    android:id="@+id/shiftButton"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:background="@drawable/ic_action_forward"
                    android:layout_marginLeft="10dp"/>

            <ImageButton
                    style="@style/HorizontalButton"
                    android:id="@+id/repeatButton"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:background="@drawable/ic_action_refresh"
                    android:layout_marginLeft="10dp"/>

            <ImageButton
                    style="@style/HorizontalButton"
                    android:id="@+id/tickButton"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:background="@drawable/ic_action_done"
                    android:layout_marginLeft="10dp"/>

        </LinearLayout>
    </RelativeLayout>


    <LinearLayout
            android:id="@+id/tickButtonsView"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:padding="0dp"
            android:orientation="horizontal"
            android:visibility="gone">

        <Button style="@style/HorizontalButton" android:text="OK"/>
        <View style="@style/VerticalDivider"/>
        <Button style="@style/HorizontalButton" android:text="Cancel"/>

    </LinearLayout>

    <LinearLayout
            android:id="@+id/repeatButtonsView"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:padding="0dp"
            android:orientation="horizontal"
            android:visibility="gone">

        <Button style="@style/HorizontalButton" android:text="day"/>
        <View style="@style/VerticalDivider"/>
        <Button style="@style/HorizontalButton" android:text="weekday"/>
        <View style="@style/VerticalDivider"/>
        <Button style="@style/HorizontalButton" android:text="week"/>
        <View style="@style/VerticalDivider"/>
        <Button style="@style/HorizontalButton" android:text="month"/>

    </LinearLayout>

    <LinearLayout
            android:id="@+id/shiftButtonsView"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:padding="0dp"
            android:orientation="horizontal"
            android:visibility="gone">

        <Button style="@style/HorizontalButton" android:text="1 week"/>
        <View style="@style/VerticalDivider"/>
        <Button style="@style/HorizontalButton" android:text="1 day"/>
        <View style="@style/VerticalDivider"/>
        <Button style="@style/HorizontalButton" android:text="1 hour"/>
        <View style="@style/VerticalDivider"/>
        <Button style="@style/HorizontalButton" android:text="10 mins"/>

    </LinearLayout>
</LinearLayout>

Am also setting this descendantFocusability in the code, just to be sure:

public class ReminderItemAdapter extends CursorAdapter {
    . . .

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View v = mLayoutInflater.inflate(R.layout.reminder_item, parent, false);
        parent.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
        ((ViewGroup) v).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
        return v;
    }

And on the styling of my ImageButton's I've set focusable=false, just for good measure:

<resources>
    <style name="HorizontalButton">
        <item name="android:layout_width">0dip</item>
        <item name="android:layout_weight">1</item>
        <item name="android:layout_height">match_parent</item>
        <item name="android:fontFamily">sans-serif</item>
        <item name="android:textSize">12sp</item>
        <item name="android:background">?android:attr/selectableItemBackground</item>
        <item name="android:focusable">false</item>
        <item name="android:focusableInTouchMode">false</item>
    </style>
    . . .

I am getting onClick's received when clicking on any part of the list item, including the child TextView elements. However when clicking on any of the ImageButtons, the click's don't get picked up. (BTW I have got OnClickListeners registered with the ImageButtons and they are getting called.)

Have set:

  • setOnItemClickListener on ListView
  • setOnItemSelectedListener on ListView
  • setOnClickListener on each ListView Item.

But none of these get called if one of the ImageButtons is clicked.

Any help would be appreciated.

3 Answers
Related