web-dev-qa-db-fra.com

OnItemClickListener ne fonctionne pas avec l'élément ListView contenant le bouton

J'ai ListView avec la coutume Adapter qui fournit View à ListView de cette façon:

   public View getView(int position, View convertView, ViewGroup parent)
   {
        RelativeLayout.LayoutParams lineParams;
        RelativeLayout line=new RelativeLayout(context);

        TextView tv=new TextView(context);
        tv.setText("Text in postion="+i);
        lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        lineParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        line.addView(tv, lineParams);
        lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);

        //checkbox
        CheckBox checkBox=new CheckBox(context);
        lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        lineParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);
        line.addView(checkBox, lineParams);
        return line;
    }

Et quelque part dans ListView il y a setOnItemClickListener(), qui devrait intercepter les événements de clic d’élément. Mon problème est que, chaque fois que j'essaie d'ajouter une case à cocher à l'élément - je ne reçois aucune réponse de ma ListView Si je saute CheckBox ou tout autre Button cela fonctionne. 

Je suis vraiment coincé avec ce problème, j'ai essayé toutes sortes de Layouts, alignement, emballage et ainsi de suite - inutile. On dirait que CheckBox interfère ListView événements de clic d'élément.

Des idées comment surmonter?

30
barmaley

il suffit d'ajouter cette ligne dans les vues d'élément au lieu de listView lui-même

Android:focusable="false"

vérifier plus de détails à ce sujet à partir de ListView personnalisé Android incapable de cliquer sur les éléments

51
Pratik

Si vous avez des boutons Image dans l'élément de liste, vous devez ajouter:

Android:descendantFocusability="blocksDescendants"

à l'élément d'élément de liste racine [tel que la présentation racine].

Ensuite, dans chaque élément ImageButton de la liste, vous devez ajouter:

Android:focusableInTouchMode="true"

Cela a fonctionné pour moi - mais j'utilisais ImageButtons, pas le bouton standard.

16
dandev91

J'ai également fait face au même problème que j'ai essayé de définir Android:focusable="false" pour listview mais cela ne fonctionne pas, alors j'ajoute ceci à l'élément listview .. add Android:focusable="false" to bascule le bouton et listview sur l'écouteur de clic d'élément recommence le travail 

13
Jaiprakash Soni

Ajouter la ligne suivante à votre liste

Android:choiceMode="singleChoice"

ou assurez-vous de définir les lignes suivantes pour vos champs de texte de mise en page

Android:focusable="false"
Android:focusableInTouchMode="false"
Android:clickable="false"
1
GameBug

Vous pouvez envisager d'écrire votre sur OnTouchEvent dans votre élément listview et envoyer le touchEvent approprié à votre vue enfant, le bouton.

0
Lion

J'avais aussi eu le problème d'un bouton dans mon ListView. Malheureusement, le fait de définir le focus sur false pour tous les objets de mon adaptateur ne fonctionnait pas pour moi.

J'ai maintenant une solution de contournement.

Dans votre adaptateur, créez un OnClickListener pour le bouton (ou un autre objet cliquable) si vous ne l'avez pas déjà fait. Dans cet OnClickListener, vous appelez vous-même OnItemClickListener.

public void onClick(View v) {
    mOnItemClickListener.setOnItemClick(mListView, v, vPos, vId);
}

Cela signifie que vous devrez donner à votre adaptateur un accès à la fois à ListView et à OnItemClickListener.

0
Vincent Ketelaars

Eh bien, je sais qu'aucune des solutions ci-dessus ne fonctionnera. J'ai essayé de modifier les attributs XML mais ceux-ci ne fonctionnent pas, mais je les ai mis en œuvre d'une nouvelle façon ... Voici comment:

Créez un interface CheckBoxOnCheckListener avec la méthode onCheckBoxChecked et transmettez les paramètres requis, implémentez l'interface CheckBoxOnCheckListener dans votre activity ou fragment contenant listView .

Ensuite, dans votre adaptateur, déclarez une mListener en tant que CheckBoxOnCheckListener et transmettez-la en tant que paramètre au constructeur de l'Adaptateur à partir de fragment/activity, transmettez-la à CheckBoxOnCheckListener et affectez-la à mListener.

Ensuite, définissez mListener comme itemView.onClick ou CheckBox.onCheckCheckedListener et onCheckChanged, appelez la méthode mListener.onCheckBoxChecked.

C'est tout. Cela fonctionnera certainement, cela a fonctionné pour moi… .. Pour le code juste pm.

0
Amit