No puede hacer clic en la fila listview con imagebutton

Tengo problemas con listview. Sus elementos (filas) tienen imagebutton. Imagebutton tiene "android: onClick" para que este evento onclick funcione, pero haga clic en la fila no funciona. Si quito imagebutton del artículo de la fila, haga clic en trabajos de la fila (el listview tiene listner correcto del onclick). Cómo puedo arreglarlo ? Necesito un evento onclick cuando el usuario haga clic en imagebutton y standart haga clic en evento, cuando el usuario seleccione la fila (no haga clic en el imagebutton pero haga clic en la fila)

Mi lista:

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

Desafortunadamente,

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

No funciona para ImageButton .

Finalmente encontré la solución aquí . En su xml de diseño para esos elementos, agregue

 android:descendantFocusability="blocksDescendants" 

A la vista raíz.

Funciona perfectamente para un ListView que tiene ImageButton s. De acuerdo con la referencia oficial , blocksDescendants significa que el ViewGroup bloqueará a sus descendientes de recibir el foco.

Puede utilizar un adaptador personalizado para su listView (si no lo ha hecho ya). Y ahí, en el getView(int position, View inView, ViewGroup parent) del adaptador haga algo como esto:

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

Vea aquí si necesita ayuda para crear su adaptador personalizado.

Si una fila de listView tiene algún elemento que se pueda hacer clic como Button , Image etc onItemClick entonces onItemClick no funcionará. Por lo tanto, necesita escribir el oyente de getView en getView de su adaptador de lista.

Para más lea esto .

Establezca estas propiedades para su botón:

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

O puede configurarlo dinámicamente en su clase de adaptador:

  yourButton.setFocusable(false); yourButton.setFocusableInTouchMode(false); 

Y asegúrese de que establece el modo de selección como único para el listview:

  listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Si una fila tiene varios elementos que se pueden hacer clic, onItemClick () no funcionará. Tendrá que configurar OnClickListener en el método getView() . Almacene a los oyentes la etiqueta de View para que puedan ser reciclados, agregue métodos a sus oyentes para que puedan ser especializados para diferentes filas.

  @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); RowClickListeners listeners = (RowClickListeners) view.getTag(); if (listeners == null) { listeners = new RowClickListeners(); } // Row click listener: RowClickListener onClickListener = listeners.rowClickListener; if (onClickListener == null) { onClickListener = new RowClickListener(); listeners.rowClickListener = onClickListener; } onClickListener.setToPosition(pos); view.setOnClickListener(onClickListener); // Overflow listener: View btn = view.findViewById(R.id.ic_row_btn); ButtonListener btnListener = listeners.buttonClickListener; if (rowListener == null) { btnListener = new ButtonListener(activity); listeners.rowClickListener = btnListener; } btnListener.setToPosition(pos); btnListener.setCollection(collectionId); btn.setOnClickListener(btnListener); } public static class RowClickListeners { public RowClickListener rowClickListener; public ButtonListener buttonClickListener; } 

En mi caso, android:descendantFocusability="blocksDescendants" para la capa principal no funcionó, ni en el ListView. También intenté el android:focusable="false" android:focusableInTouchMode="false" que oí que está trabajando para los botones, pero tenía ImageButton así que no.

Pero establecer las propiedades del botón en el archivo CS del diseño funcionó.

 var imageButton = view.FindViewById<ImageButton>(Resource.Id.imageButton1); imageButton.Focusable = false; imageButton.FocusableInTouchMode = false; imageButton.Clickable = true; 

Ninguna respuesta por encima trabajó para mí, pero una combinación lo hizo.

Ahora android:descendantFocusability="blocksDescendants" en el ListView y android:focusable="false" android:focusableInTouchMode="false" en los ImageButtons en el XML Y en Java también establecí descendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS) en el ListView y focusable(false), focusableInTouchMode(false), clickable(true) en los ImageButtons.

  • configurar el color de fondo en listview
  • Android ListView Footer View no se coloca en la parte inferior de la pantalla
  • ListView OnItemLongClickListener () no activado
  • Android ListView múltiples matrices con adaptador personalizado
  • Biblioteca de cargador de imágenes universal está actuando lento en Android 5.0 en comparación con Android 4.4.4
  • Separadores ListView con un CursorAdapter
  • ListView setText en una posición determinada
  • En ListView: la actividad ha filtrado ServiceConnection <youtube.player.internal> que estaba vinculado originalmente aquí
  • Actualización de Android ListView con SimpleCursorAdapter
  • Android cómo identificar el elemento en listview con casilla de verificación
  • ¿Cómo agregar varios encabezados a lo largo de un único ListView con addHeaderView ()?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.