web-dev-qa-db-fra.com

ListView et boutons à l'intérieur de ListView

Je souhaite afficher une Button dans la ListView. L’objectif doit être de cliquer sur la ligne ListView ou sur le bouton.

Cliquez sur la ligne pour afficher plus d'informations . Cliquez sur le bouton pour afficher en bas d'autres boutons.

Le même que 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 la ListView, le bouton n'est pas cliquable . Si j'ajoute le à la LinearLayout du bouton llButton.setClickable() cela fonctionne Mais seulement le bouton. La ListView elle-même ne réagit plus aux clics!

J'ai essayé cet exemple .

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

57
chrisonline

Si vous utilisez un adaptateur personnalisé, le clic du bouton dans ListView ne fonctionnera pas. Vous devez donc essayer d'utiliser le code suivant pour rechercher OnItemClickListener.

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

Soyons clairs - et personne ne semble avoir dit une chose aussi simple -, même s’il n’est pas autorisé à faire fonctionner un bouton de mise au point en conjonction avec la liste, il existe une solution beaucoup plus simple.

La réponse acceptée est évidente - vous devriez toujours le faire lorsque vous définissez l'écouteur de clics pour les éléments de la liste. Il est donc ridicule que OP ne le sache pas.

Si vous utilisez une présentation XML en tant qu'élément de votre liste, définissez simplement le bouton avec l'attribut suivant, ce qui entraînera la possibilité de cliquer sur l'élément de la liste:

Android:focusable="false"

120
teh1

Ajoutez la ligne ci-dessous à votre élément de liste XML.

Android:descendantFocusability="blocksDescendants"

Ensuite, votre élément de 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>
18
Faruk Toptas

Pour que l'événement soit déclenché lorsque l'utilisateur clique sur le bouton ou l'élément de liste, vous pouvez procéder comme suit:

Vous ne gérez que 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 qu'il ne soit pas cliquable/ne puisse pas être mis au point (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);               
    }
}
7
beta

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

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

Et dans l'adaptateur, ajoutez simplement un écouteur de clic dans la vue des boutons.

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);
    .....
}
0
Kokusho