¿Cómo disparar onListItemClick en la Lista de acciones con los botones en la lista?

Tengo una ListActivity simple que usa un ListAdapter personalizado para generar las vistas en la lista. Normalmente, el ListAdapter simplemente llena las vistas con TextViews, pero ahora también quiero poner un botón allí.

Sin embargo, entiendo y tengo la experiencia de que poner una vista enfocable en el elemento de la lista evita el encendido de onListItemClick () en ListActivity cuando se hace clic en el elemento de la lista. El botón todavía funciona normalmente dentro del elemento de la lista, pero cuando se presiona algo además del botón, quiero que se active onListItemClick.

¿Cómo puedo hacer que esto funcione?

como escribí en el comentario anterior, la solución es setFocusable (false) en ImageButton.

Hay una solución aún más elegante, intente agregar android:descendantFocusability="blocksDescendants" en el diseño raíz del elemento list. Esto hará que los clics enListItem sean posibles y, por separado, puede manejar los clics de Button o ImageButton.

Espero eso ayude 😉

Aclamaciones

Espero poder ayudar aquí. Supongo que tiene un diseño personalizado para los artículos de ListView, y este diseño consiste en botones y algunas otras vistas, como TextView, ImageView o lo que sea. Ahora desea que se activen diferentes eventos al hacer clic en el botón y que se activen diferentes eventos en todo lo demás que haga clic.

Puede lograr eso sin usar onListItemClick () de su ListActivity.
Esto es lo que tienes que hacer:

Está utilizando un diseño personalizado, por lo que probablemente esté anulando el método getView () desde su adaptador personalizado. El truco es establecer los diferentes oyentes para su botón y diferentes para toda la vista (su fila). Eche un vistazo al ejemplo:

 private class MyAdapter extends ArrayAdapter implements OnClickListener { public MyAdapter(Context context, int resource, int textViewResourceId, List objects) { super(context, resource, textViewResourceId, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { String text = getItem(position); if (null == convertView) { convertView = mInflater.inflate(R.layout.custom_row, null); } //take the Button and set listener. It will be invoked when you click the button. Button btn = (Button) convertView.findViewById(R.id.button); btn.setOnClickListener(this); //set the text... not important TextView tv = (TextView) convertView.findViewById(R.id.text); tv.setText(text); //!!! and this is the most important part: you are settin listener for the whole row convertView.setOnClickListener(new OnItemClickListener(position)); return convertView; } @Override public void onClick(View v) { Log.v(TAG, "Row button clicked"); } } 

Su clase OnItemClickListener podría declararse como aquí:

 private class OnItemClickListener implements OnClickListener{ private int mPosition; OnItemClickListener(int position){ mPosition = position; } @Override public void onClick(View arg0) { Log.v(TAG, "onItemClick at position" + mPosition); } } 

Por supuesto, probablemente agregará algunos parámetros más al constructor OnItemClickListener.
Y una cosa importante: la implementación de getView que se muestra arriba es bastante fea, normalmente debería usar el patrón ViewHolder para evitar las llamadas a findViewById … pero probablemente ya lo sepa.
Mi archivo custom_row.xml es RelativeLayout con Button of id “button”, TextView of id “text” y ImageView of id “image”, solo para aclarar las cosas.
¡Saludos!

Cuando un ListView personalizado contiene elementos enfocables, onListItemClick no funcionará (creo que es el comportamiento esperado). Solo elimine el foco de la vista personalizada, hará el truco:

Por ejemplo:

 public class ExtendedCheckBoxListView extends LinearLayout { private TextView mText; private CheckBox mCheckBox; public ExtendedCheckBoxListView(Context context, ExtendedCheckBox aCheckBoxifiedText) { super(context); … mText.setFocusable(false); mText.setFocusableInTouchMode(false); mCheckBox.setFocusable(false); mCheckBox.setFocusableInTouchMode(false); … } } 

Tengo el mismo problema: ¡OnListItemClick no está activado! [SOLUCIONADO]
Eso sucede en la clase que extiende ListActivity,
con un diseño para ListActivity que contenía TextBox y ListView nesteds en LinearLayout
y otro diseño para las filas (un CheckBox y un TextBox nesteds en LineraLayout).

Ese es el código:

res / layout / configpage.xml (principal para ListActivity)

      res/layout/row.xml (layout for single row)     

src /…/…/ ConfigPage.java

 public class ConfigPage extends ListActivity { TextView selection; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.configpage); // loaded from res/value/strings String[] azioni = getResources().getStringArray(R.array.ACTIONS); setListAdapter(new ArrayAdapter<String>(this, R.layout.row, R.id.testo, azioni)); selection = (TextView) findViewById(R.id.selection); } public void onListItemClick(ListView parent, View view, int position, long id) { selection.setText(" " + position); } } 

Esto comienza a funcionar cuando agregué en row.xml

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

Yo uso Eclipse 3.5.2
Android SDK 10.0.1
Versión min SDK: 3

Espero que esto sea útil
… y lo siento por mi Inglés 🙁

simplemente agrega android:focusable="false" como uno de los atributos de tu botón

He tenido el mismo problema con ToggleButton. Después de medio día de golpear mi cabeza contra una pared finalmente lo resolví. Es tan simple como hacer que la vista enfocable no sea enfocable, usando ‘android: enfocable’. También debe evitar jugar con la capacidad de enfoque y la capacidad de clics (que acabo de inventar) de la fila de la lista, simplemente déjelas con el valor predeterminado.

Por supuesto, ahora que sus vistas enfocables en la fila de la lista no son enfocables, los usuarios que usan el teclado pueden tener problemas, bueno, enfocándolos. No es probable que sea un problema, pero en caso de que quiera escribir aplicaciones 100% perfectas, podría usar el evento onItemSelected para hacer que los elementos de la fila seleccionada sean enfocables y los elementos de la fila seleccionada previamente no enfocables.

  ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView parent, View view, int position, long id) { // When clicked, show a toast with the TextView text Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); } }); 

Utilicé getListAdapter (). GetItem (position) creando una instancia de un objeto que mantiene mis valores dentro del elemento

 MyPojo myPojo = getListAdapter().getItem(position); 

luego usó el método getter del myPojo que llamará a sus valores correctos dentro del artículo.