2010-06-15 5 views
56

Je souhaite afficher un Button à l'intérieur du ListView. L'objectif devrait être de cliquer sur la ligne ListView ou sur le bouton.ListView et les boutons à l'intérieur de ListView

Cliquez sur la ligne pour afficher plus d'informations. Cliquez sur le bouton qu'il affiche en bas de plus de boutons.

Identique à l'application GMAIL.

Sur la droite, il y a une case à cocher et après avoir cliqué sur la case en bas, la barre de boutons apparaît.

Mon problème est après avoir inséré le bouton dans le ListView, le bouton n'est pas cliquable. Si j'ajoute le à LinearLayout à partir du bouton llButton.setClickable() cela fonctionne. Mais, seulement le bouton. Le ListView lui-même ne réagit plus aux clics!

J'ai essayé this example.

Le même problème que ci-dessus ...

+0

Avez-vous essayez d'utiliser le menu contextuel pour le listview? – primpap

+0

Oui j'ai un menu contextuel, mais je veux aussi ajouter une case à cocher. – chrisonline

+0

Peut-être que ma réponse sur [this] (http://stackoverflow.com/q/7533027/562935) question peut aider. – tidbeck

Répondre

8

Si vous utilisez un adaptateur personnalisé le clic de bouton à l'intérieur d'un ListView ne fonctionnera pas, vous devriez donc essayer d'utiliser le code suivant pour vérifier OnItemClickListener.

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

La réponse fournie par teh1 ci-dessous est meilleure. –

+0

@Venky plz regardez sur ce lien http://stackoverflow.com/questions/12346481/onclick-button-in-listview-in-android –

116

Juste pour que ce soit clair - et personne ne semble avoir dit quelque chose ce simple - tandis que l'on n'a pas le droit d'avoir un travail de bouton focusable conjointement avec la vue de la liste, il y a une solution beaucoup plus simple pour cette .

La réponse acceptée est une donnée - vous devriez toujours le faire lors de la définition de l'écouteur de clic pour les éléments de la liste, c'est donc idiot que OP ne le savait pas.

Si vous utilisez une mise en page XML comme élément de la liste, réglez simplement sur le bouton pour avoir l'attribut suivant et il fera l'objet de liste cliquable ainsi:

android:focusable="false"

+0

Merci, ça a réglé un problème auquel je faisais face! – Yosi199

+0

Etrangement, cette astuce ne fonctionne pas avec ImageButton. Connaissez-vous ceux qui le font? –

+25

Je suppose que cela ne devrait pas être étrange, vu que ImageButton étend ImageView, tandis que Button étend TextView. Avec ImageButton. cette astuce fonctionne, mais doit être définie après les changements de visibilité. (C'était mon problème). –

7

Pour avoir la événement déclenché lorsque la touche ou sur l'élément de liste est cliqué, vous pouvez effectuer les opérations suivantes:

vous poignée seulement onItemClick:

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

Dans l'adaptateur vous modifiez le bouton pour ne pas être cliquable/focalisable (ou le faire dans le fichier xml à la place):

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

Ajouter la ligne ci-dessous pour votre XML d'élément de liste.

android:descendantFocusability="blocksDescendants" 

Ensuite, votre élément de la liste sera comme ceci:

<?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

Ceci est la seule réponse qui a résolu mon problème –

+1

même pour moi. au revoir – Xan

0

Dans mon cas, je devais ajouter cet attribut dans le listView:

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

Et dans l'adaptateur, ajouter cliquez sur l'écouteur dans la vue du bouton.

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

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

Il est important de définir les variables finales:

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