OnItemClickListener ne fonctionne pas avec l'élément ListView contenant le bouton
-
29-10-2019 - |
Question
J'ai ListView
avec un Adapter
personnalisé qui fournit View
au ListView
de cette manière:
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 mon 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 mises en page, alignement, habillage et ainsi de suite - inutile.On dirait que CheckBox
interfère avec les événements de clic sur les éléments ListView
.
Des idées comment surmonter?
La solution
ajoutez simplement cette ligne dans les vues des éléments au lieu de listView elle-même
android:focusable="false"
Consultez plus de détails à ce sujet sur ListView personnalisé Android incapable de cliquer sur les éléments
Autres conseils
Si vous avez des ImageButtons dans l'élément de liste, vous devez ajouter:
android:descendantFocusability="blocksDescendants"
à l'élément d'élément de liste racine [tel que la disposition racine].
Ensuite, dans chaque ImageButton de l'élément de liste, vous devez ajouter:
android:focusableInTouchMode="true"
Cela a fonctionné pour moi - mais j'utilisais ImageButtons, pas le bouton standard.
J'ai également rencontré le même problème que j'ai essayé de définir android:focusable="false"
sur listview mais cela ne fonctionne pas alors j'ajoute ceci à l'élément listview .. comme dans mon élément listview, j'ai utilisé le bouton Basculer qui créait un problème, j'ajouteandroid:focusable="false"
to Toggle button and listview on item click listener start work again
Ajoutez la ligne suivante à votre listeAfficher
android:choiceMode="singleChoice"
ou assurez-vous de définir les lignes suivantes dans vos champs de texte de mise en page
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
J'avais également eu le problème d'un bouton dans ma ListView.Malheureusement, le simple fait de définir le focus sur false pour tous les objets de mon adaptateur n'a pas fonctionné pour moi.
J'ai maintenant une solution de contournement.
Dans votre adaptateur, créez un OnClickListener pour le bouton (ou tout 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 au ListView parent et au OnItemClickListener.
Vous pouvez envisager d'écrire votre onTouchEvent dans votre élément de vue de liste et d'envoyer le touchEvent approprié à votre vue enfant, le bouton.
Eh bien, je sais qu'aucune des solutions ci-dessus ne fonctionnera.J'ai essayé de changer les attributs xml mais cela ne fonctionne pas, mais je l'ai implémenté d'une nouvelle manière. Voici comment:
Créez une interface CheckBoxOnCheckListener
avec la méthode onCheckBoxChecked
et passez les paramètres nécessaires, implémentez l'interface CheckBoxOnCheckListener
dans votre activité ou fragment contenant listView .
Ensuite, dans votre adaptateur, déclarez un mListener
en tant que CheckBoxOnCheckListener
, et transmettez-le en tant que paramètre au constructeur de l'adaptateur à partir de fragment/activity
et convertissez-le en CheckBoxOnCheckListener
et affectez-le à mListener
.
Ensuite, définissez mListener
comme itemView.onClick
ou CheckBox.onCheckCheckedListener
et la méthode onCheckChanged
appelle mListener.onCheckBoxChecked
.
Voilà.Cela fonctionnera certainement, cela a fonctionné pour moi. Pour le code juste pm.
Si vous utilisez ListView
dans Activity
, assurez-vous d'avoir configuré setOnItemClickListener()
myListView.setOnItemClickListener(this); // if your activity implement OnItemClickListener