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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top