2010-06-15 45 views
56

Quiero mostrar un Button dentro del ListView. El objetivo debe ser hacer clic en la línea ListView o en el botón.ListView y botones dentro de ListView

Haga clic en la línea que muestra más información. Haga clic en el botón que se muestra en la parte inferior de más botones.

Lo mismo que la aplicación GMAIL.

A la derecha hay una casilla de verificación y después de hacer clic en la casilla de verificación en la parte inferior, aparece la barra de botones.

Mi problema es después de insertar el botón en el ListView, no se puede hacer clic en el botón. Si agrego el a LinearLayout desde el botón llButton.setClickable(), funciona. Pero, solo el botón. ¡El ListView ya no reacciona a los clics!

He intentado this example.

El mismo problema que el anterior ...

+0

¿Usted intentó utilizar el menú contextual de la vista de lista? – primpap

+0

Sí, tengo un menú contextual, pero también quiero agregar una casilla de verificación. – chrisonline

+0

Tal vez mi respuesta en [este] (http://stackoverflow.com/q/7533027/562935) pregunta puede ayudar. – tidbeck

Respuesta

8

Si está utilizando un adaptador personalizado clic en el botón dentro de un ListView no funciona lo que debe tratar de usar el siguiente código para comprobar si hay OnItemClickListener.

listId.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    public void onItemClick(AdapterView<?> list, View v, int pos, long id) { 
     // Your code for item clicks 
    } 
}); 
+8

La respuesta proporcionada por teh1 a continuación es mejor. –

+0

@Venky plz mira este enlace http://stackoverflow.com/questions/12346481/onclick-button-in-listview-in-android –

116

Sólo para dejar esto claro - y nadie parece tener dicho algo tan sencillo - mientras no se le permite tener una obra botón enfocable en conjunto con la vista de lista, hay una solución mucho más simple para este .

La respuesta aceptada es un hecho: siempre debe hacer eso al configurar el oyente clic para los elementos de la lista, por lo que es tonto que OP no lo sepa.

Si está utilizando un diseño de XML como su elemento de la lista, sólo tiene que ajustar el botón para que el atributo siguiente y hará que el elemento de la lista que se puede hacer clic, así:

android:focusable="false"

+0

¡Gracias, resolvió un problema que estaba enfrentando! – Yosi199

+0

Extrañamente, este truco no funciona con ImageButton. ¿Conoces a alguien que lo haga? –

+25

Supongo que no debería ser extraño, ya que ImageButton extiende ImageView, mientras que Button extiende TextView. Con ImageButton. este truco funciona, pero debe establecerse después de los cambios en la visibilidad. (Ese fue mi problema). –

7

Para que el evento se activa cuando se hace clic en el botón o el elemento de la lista, puede hacer lo siguiente:

Sólo se manejan onItemClick:

mListView.setOnItemClickListener(new ListView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> a, View v, int i, long l) { 
     // handle click here 
    } 
); 

En el adaptador que modifique el botón para que no se pueda hacer clic/enfocable (o hacerlo en el archivo XML en su lugar):

public class MyAdapter extends BaseAdapter { 
    ... 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ..... 
     Button btn = view.findViewById(R.id.button); 
     btn.setFocusable(false); 
     btn.setClickable(false);    
    } 
} 
16

Añadir la siguiente línea a su lista de elementos XML.

android:descendantFocusability="blocksDescendants" 

A continuación, el elemento de la lista será la siguiente:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:descendantFocusability="blocksDescendants" 
android:layout_height="wrap_content" > 

    // Your layout objects here 

</RelativeLayout> 
+1

Esta es la única respuesta que solucionó mi problema –

+1

mismo para mí. adiós – Xan

0

En mi caso he tenido que añadir este atributo en la vista de lista:

<ListView 
... 
android:clickable="true" 
... 
</ListView> 

Y en el adaptador sólo tiene que añadir el haga clic en oyente en la vista de botones.

wrapper.getButtonHi().setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      DebugUtils.logDebug("Clickeado :: "+ mContact.getUserId()); 
     } 
}); 

Es importante establecer las variables finales:

public View getRowView(final int position, View convertView, ViewGroup parent) { 
    final BrowseContactItemWrapper wrapper; 
    final UserModel mContact = lstContact.get(position); 
    ..... 
}