Tratando de coger un clic en android ListView item: android: descendantFocusability = "blocksDescendants" no funciona

Esto ha sido abordado en muchos puestos en StackOverflow. La solución más recomendada es establecer:

android:descendantFocusability="blocksDescendants" 

En el diseño raíz del diseño del elemento de lista. He hecho lo siguiente.

  • Establecer android:descendantFocusability="blocksDescendants" en el diseño de elementos de lista raíz.
  • Se llama setDescendantFocusability(BLOCK) en el listView, así como cada listViewItem.
  • Establecer el focus=disabled en ImageButtons

Sin embargo, cuando se hace clic en uno de los ImageButtons hijo, no puedo obtener ningún oyente en los elementos ListView o ListView para disparar.

A continuación se muestra la "plantilla" que estoy usando para procesar un elemento de lista.

 <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> 

También estoy estableciendo este descendantFocusability en el código, sólo para estar seguro:

 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; } 

Y en el estilo de mi ImageButton que he fijado focusable = false, sólo por buena medida:

 <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> . . . 

Estoy recibiendo onClick recibido al hacer clic en cualquier parte del elemento de la lista, incluidos los elementos TextView para niños. Sin embargo, al hacer clic en cualquiera de los ImageButtons, el clic no se recoge. (BTW tengo OnClickListeners registrado con los ImageButtons y se están llamando.)

Haber instalado:

  • SetOnItemClickListener en ListView
  • SetOnItemSelectedListener en ListView
  • SetOnClickListener en cada elemento ListView.

Pero ninguno de estos se llama si se hace clic en uno de los ImageButtons.

Cualquier ayuda sería apreciada.

Trate de usar esto dentro de cada diseño de los botones

  android:focusable="false" android:focusableInTouchMode="false" 

Y quitar otra cosa que usted está haciendo para esto. También de listview. También eliminar esto

 android:descendantFocusability="blocksDescendants" 

y esto también

 parent.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); ((ViewGroup) v).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 

Sólo tienes que poner android:focusable="false" en la fila / item.xml de la listView.

Resuelve todo tu problema. Si pones un event listener on the listView .. No te permitirá hacer clic en toda ListView Row. quiero decir

listView.setOnClickListener(this); No será llamado. Porque el foco se mueve a la row/item of the listView . Agregando android:focusable="false" al Button o ImageView en el que se pone un Evento. Se perderá su enfoque y el enfoque es ganar por listView. Ahora puede tener listView clickable as well as its descendents rows/item..

En pocas palabras poner android:focusable="false en TextView/Button or ImageView que tienen el evento Listeners en el artículo / row.xml.

¿Has probado a agregar android: clickable = "false" para los botones? Me encontré con un problema similar y que lo arregló para mí, mientras que el uso de android: focusable = "false" no.

¡Buena suerte!

  • Creación de ListView mediante programación
  • ListView setOnItemClickListener no funciona agregando botón
  • Android: los elementos no habilitados de ListView dibujan un divisor invisible
  • ListView: excepción de puntero nulo
  • ¿Cómo notificar a DataSetChange () del método onitemclick ()?
  • Obtener java.lang.ArrayIndexOutOfBoundsException en android
  • Parece que no se puede visualizar un ListView y un AdView al mismo tiempo
  • Crear ListView programaticamente
  • Las filas Listview ordenan cambios al azar en el desplazamiento de listview en android
  • Cómo arredondar las esquinas del elemento de lista en la parte superior e inferior de la vista de lista? (No sólo para las partes superior e inferior)
  • Cómo agregar un elemento secundario en Android ListView?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.