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?
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
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.
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
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"
Vous pouvez envisager d'écrire votre sur OnTouchEvent dans votre élément listview et envoyer le touchEvent approprié à votre vue enfant, le bouton.
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.
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.