OnItemCLickListener no funciona en listview

Código de clase de Activity :

 conversationList = (ListView)findViewById(android.R.id.list); ConversationArrayAdapter conversationArrayAdapter=new ConversationArrayAdapter(this, R.layout.conversation_list_item_format_left, conversationDetails); conversationList.setAdapter(conversationArrayAdapter); conversationList.setOnItemClickListener(new AdapterView.OnItemClickListener(){ @Override public void onItemClick(AdapterView arg0, View arg1, int position, long arg3) { Log.d("test","clicked"); } }); 

La función getView en la clase Adapter :

 if (v == null) { LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(leftSideMessageNumber.equals(m.getTo())) { v = vi.inflate(R.layout.conversation_list_item_format_left, null); } else { v = vi.inflate(R.layout.conversation_list_item_format_right, null); } } 

¿Hay algún problema con el uso de dos xmls mientras se infla?

Acabo de encontrar una solución desde aquí … pero haciendo un clic profundo …

Si algún elemento de la fila de la lista contiene una vista OnItemClickListener o OnItemClickListener entonces OnItemClickListener no funcionará.

El elemento de la fila debe tener un parámetro como android:descendantFocusability="blocksDescendants" .

Aquí puedes ver un ejemplo de cómo debería ser tu elemento de la lista. El elemento xml de la lista debe ser … row_item.xml (your_xml_file.xml)

  // your other widgets here  

El problema es que sus diseños contienen elementos enfocables o clicables. Si una vista contiene un elemento enfocable o cliqueable, no se invocará OnItemCLickListener.

Haga clic aquí para más información.

Por favor, publique uno de sus diseños xmls si ese no es el caso.

Para mis listas, mis filas tienen otras cosas en las que se puede hacer clic, como botones, por lo que hacer una manta bloqueaDescendientes no funciona. En su lugar, agrego una línea en el xml del botón:

  android:focusable="false" 

Eso evita que los botones bloqueen los clics en las filas, pero deja que los botones tomen los clics también.

necesita hacer 2 pasos en su listview_item.xml

  1. establece el diseño de la raíz con: android:descendantFocusability="blocksDescendants"
  2. configure cualquier vista enfocable o clicable en este elemento con:
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false"

Aquí hay un ejemplo: listview_item.xml

     

utilice el código siguiente dentro de la etiqueta de botón en el diseño de fila personalizado de listview

  android:focusable="false" android:clickable="false" 

Tuve el mismo problema y acabo de ver que había configurado accidentalmente:

 @Override public boolean isEnabled(int position) { return false; } 

en mi clase CustomListViewAdapter.

Al cambiar esto a:

 return true; 

He logrado arreglar el problema. Por si acaso, si alguien ha cometido el mismo error …

Usa android: descendantFocusability

  

Agregar arriba en el diseño de la raíz

Lo resolví con la ayuda de esta respuesta

1.Agregue lo siguiente en Diseño lineal de list_items.xml android:descendantFocusability="blocksDescendants"

2. Vistas de niños de LinearLayout en list_items.xml

  android:focusable="false" 

si tiene textviews, botones o stg clicables o seleccionables en su vista de fila solamente

 android:descendantFocusability="blocksDescendants" 

no es suficiente. Tienes que establecer

 android:textIsSelectable="false" 

a tus textviews y

 android:focusable="false" 

a sus botones y otros elementos enfocables.

Incluso yo estaba teniendo el mismo problema, estoy teniendo una checkbox, hice lo siguiente para enmascarar el trabajo ItemClickListener,

Se agregaron las siguientes propiedades a la checkbox

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

y ItemClickListner comenzó a funcionar.

Para un ejemplo detallado puede ir a través del enlace,

http://knowledge-cess.com/android-itemclicklistner-with-checkbox-or-radiobutton/

Espero que ayude ¡Salud!

Tuve el mismo problema e intenté todas las soluciones mencionadas en vano. a través de las pruebas descubrí que hacer que el texto sea seleccionable impedía que se llamara al oyente. Así que al cambiarlo a falso o eliminarlo, mi oyente fue llamado nuevamente.

 android:textIsSelectable="false" 

Espero que esto ayude a alguien que estaba atrapado como yo.

Dos soluciones increíbles fueron las siguientes: si amplía ListFragment a partir de un fragmento, sepa que mListView.setOnItemClickListener no se llamará antes de que se cree su actividad, esto garantiza que se establezca cuando se haya creado la actividad

 @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView adapterView, View view, int position, long rowId) { // Do the onItemClick action Log.d("ROWSELECT", "" + rowId); } }); } 

Mientras miraba el código fuente de ListFragment, me encontré con esto

 public class ListFragment extends Fragment { ........................................... ................................................ final private AdapterView.OnItemClickListener mOnClickListener = new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView parent, View v, int position, long id) { onListItemClick((ListView)parent, v, position, id); } }; ................................................................ ................................................................ public void onListItemClick(ListView l, View v, int position, long id) { } } 

Se onItemClickListener objeto onItemClickListener y llama onListItemClick() Como tal, la otra solución similar, que funciona de la misma manera es anular onListItemClick()

 @Override public void onListItemClick(ListView l, View v, int position, long rowId) { super.onListItemClick(l, v, position, id); // Do the onItemClick action Log.d("ROWSELECT", "" + rowId); } 
  1. Agregar esto en el diseño principal

     android:descendantFocusability="blocksDescendants" 
  2. Escriba este código en cada botón, Textview, ImageView, etc. que tienen onClick

     android:focusable="false" android:clickable="false" 

Espero que funcione

en mi caso, ninguna de las propiedades de diseño xml no fue útil.

Solo agrego una sola línea de código como esta: convertView.setClickable (false);

 @NonNull @Override public View getView(final int position, View convertView, @NonNull ViewGroup parent) { ViewHolder viewHolder; if (convertView == null || convertView.getTag() == null) { LayoutInflater inflater = LayoutInflater.from(context); convertView = inflater.inflate(R.layout.my_layout_id, parent, false); viewHolder = new ViewHolder(convertView); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } ... convertView.setClickable(false); return convertView; } 

básicamente hace lo mismo que configurar propiedades en el diseño xml, pero fue lo único que funciona en mi caso.

No es el momento perfecto, pero tal vez ayudará a alguien Feliz encoding

He intentado todo lo anterior y NADA funcionó.

Resolví el problema de la siguiente manera:

Primero defino un botón personalizado llamado ListButton

 public class ListButton extends android.widget.Button { private ButtonClickedListener clickListener; public ListButton(Context context) { this(context, null); } public ListButton(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ListButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public void setClickListener(ButtonClickedListener listener) { this.clickListener = listener; } @Override public boolean isInTouchMode() { return true; } @Override public boolean onTouchEvent(MotionEvent event) { return false; } @Override public boolean dispatchTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_UP: eventClicked(); break; case MotionEvent.ACTION_CANCEL: break; case MotionEvent.ACTION_MOVE: break; default : } return true; } private void eventClicked() { if (this.clickListener!=null) { this.clickListener.ButtonClicked(); } } } 

El XML se ve así:

  

Luego defino mi propia interfaz de ButtonClicked con el ButtonClicked :

 public interface ButtonClickedListener { public void ButtonClicked(); } 

Luego uso mi propio oyente como si fuera el OnClickListener normal:

 final ListButton cancelButton = (ListButton) viewLayout.findViewById(R.id.cancel_button); cancelButton.setClickListener(new ButtonClickedListener() { @Override public void ButtonClicked() { //Do your own stuff here... } }); 

Si desea utilizar el simple clic y el clic largo en la lista, ver los elementos de una mejor manera de implementar que sería usar el menú contextual para un clic prolongado. Evite usar setItemLongClickListener, especialmente si tiene múltiples diseños de filas para su vista de lista.

Enfrentó el mismo problema, lo intentó durante horas. Si ha intentado todo lo anterior, intente cambiar el layout_width de Listview y el elemento de la lista para match_parent from wrap_content.

Todo lo anterior falló para mí. Sin embargo, pude resolver el problema (después de muchas horas de darme un golpe en la cabeza: Google, si está escuchando, considere corregir lo que encontré a continuación en forma de errores de comstackción, si es posible)

Realmente debe tener cuidado con los atributos de Android que agrega a su diseño xml aquí (en esta pregunta original, se llama list_items.xml). Para mí, lo que estaba causando el problema era que había cambiado de una vista EditText a una TextView y tenía rests de cruxt de atributo del cambio (en mi caso, inputType). El comstackdor no lo captó y la capacidad de clics simplemente falló cuando fui a ejecutar la aplicación. Verifique todos los atributos que tiene en sus nodos xml de diseño.

Android: el atributo de texto automático también hace que TextView sea enfocable automáticamente.