Tengo un lugar ListView
donde cada elemento de la lista contiene un TextView y dos botones diferentes. Algo como esto:
ListView
--------------------
[Text]
[Button 1][Button 2]
--------------------
[Text]
[Button 1][Button 2]
--------------------
... (and so on) ...
Con este código puedo crear un OnItemClickListener
para todo el artículo:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> list, View view, int position, long id) {
Log.i(TAG, "onListItemClick: " + position);
}
}
});
Sin embargo, no quiero que se pueda hacer clic en todo el elemento, sino solo los dos botones de cada elemento de la lista.
Entonces mi pregunta es, ¿cómo implemento un onClickListener para estos dos botones con los siguientes parámetros:
int button
(en qué botón del elemento se ha hecho clic)int position
(que es el elemento en la lista en la que ocurrió el clic del botón)
Actualización: encontré una solución como se describe en mi respuesta a continuación. Ahora puedo hacer clic / tocar el botón a través de la pantalla táctil. Sin embargo, no puedo seleccionarlo manualmente con el trackball. Siempre selecciona todo el elemento de la lista y desde allí va directamente al siguiente elemento de la lista ignorando los botones, aunque configuré .setFocusable(true)
y setClickable(true)
para los botones getView()
.
También agregué este código a mi adaptador de lista personalizado:
@Override
public boolean areAllItemsEnabled() {
return false;
}
@Override
public boolean isEnabled(int position) {
return false;
}
Esto hace que ya no se pueda seleccionar ningún elemento de la lista. Pero no ayudó a hacer que los botones anidados fueran seleccionables.
Alguien una idea?
Respuestas:
La solución a esto es realmente más fácil de lo que pensaba. Simplemente puede agregar en el
getView()
método de su adaptador personalizado un setOnClickListener () para los botones que está utilizando.Todos los datos asociados con el botón deben agregarse
myButton.setTag()
en elgetView()
y se puede acceder en onClickListener a través deview.getTag()
Publiqué una solución detallada en mi blog como tutorial.
fuente
Esta es una especie de apéndice de la respuesta de @ znq ...
Hay muchos casos en los que desea conocer la posición de la fila para un elemento en el que se hizo clic Y desea saber qué vista de la fila se tocó. Esto va a ser mucho más importante en las IU de las tabletas.
Puede hacerlo con el siguiente adaptador personalizado:
fuente
Para futuros lectores:
Para seleccionar manualmente los botones con el uso del trackball:
Y para deshabilitar el enfoque en todos los elementos de la lista:
Funciona bien para mí, puedo hacer clic en los botones con pantalla táctil y también permite enfocar un clic usando el teclado
fuente
No tengo mucha experiencia que los usuarios anteriores, pero me enfrenté a este mismo problema y lo resolví con la siguiente solución
Evento btnRemoveClick Click
fuente
Probablemente hayas encontrado cómo hacerlo, pero puedes llamar
y ahora tus botones se enfocarán
fuente
No estoy seguro de ser la mejor manera, pero funciona bien y todo el código permanece en su ArrayAdapter.
fuente
Sé que es tarde, pero esto puede ayudar, este es un ejemplo de cómo escribo una clase de adaptador personalizado para diferentes acciones de clic
fuente
¿No es la solución de plataforma para esta implementación utilizar un menú contextual que se muestra en una pulsación larga?
¿El autor de la pregunta conoce los menús contextuales? Apilar botones en una vista de lista tiene implicaciones de rendimiento, desordenará su interfaz de usuario y violará el diseño de interfaz de usuario recomendado para la plataforma.
Por otro lado; Los menús contextuales, por naturaleza de no tener una representación pasiva, no son obvios para el usuario final. Considere documentar el comportamiento?
Esta guía debería darte un buen comienzo.
http://www.mikeplate.com/2010/01/21/show-a-context-menu-for-long-clicks-in-an-android-listview/
fuente