Android listview avec problème de case à cocher

j'ai un problème bizarre! J'essaie de créer une listview avec des cases à cocher. Dans mon autre thread on m'a dit que je devrais utiliser un tableau qui garde la trace des lignes qui sont vérifiées. J'ai fait ça et ça a bien marché, mais la logique est fausse et je rencontre un autre problème maintenant.

public View getView(final int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.row, null);
        }

        CheckBox checkbox = (CheckBox)v.findViewById(R.id.checkbox);
        checkbox.setChecked(checked[position]);

        final LinearLayout rowLayout = (LinearLayout) v.findViewById(R.id.individualRow);

        checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener(){

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked)
                {
                    rowLayout.setBackgroundColor(Color.GRAY);                       
                    checked[position] = false;                      
                }
                else
                {   
                    rowLayout.setBackgroundColor(Color.DKGRAY);
                    checked[position] = true;                       
                }
            }               
        });
   }

ayant toutes les cases à cocher non vérifié initialement, il fonctionne très bien, il garde Ceux que je sélectionne vérifié, même si je fais défiler vers le bas et de nouveau vers le haut, mais les bagages tableau n'est pas correctement configuré. Fondamentalement, le test si devrait être l'inverse arround!

if(isChecked)
{
   rowLayout.setBackgroundColor(Color.GRAY);                        
   checked[position] = true;                        
}
else
{   
   rowLayout.setBackgroundColor(Color.DKGRAY);
   checked[position] = false;                       
}

le problème est avec le scroll vraiment parce que chaque fois que je fais défiler la méthode onCheckedChanged est appelé et depuis son recyclage les lignes il passe dans la position de la nouvelle ligne que son pas sélectionné mais puisqu'il a le même index que celui qui a été précédemment sélectionné il change sa valeur. par exemple si je coche la case d'indice 2 (vrai) et puis faites défiler vers le bas une nouvelle ligne devient ligne avec l'index 2, la méthode est appelée de nouveau et elle désactive la case à cocher(le champ dans le tableau coché).

j'en ai besoin pour" se souvenir " de toutes les cases qui sont cochées. En d'autres termes je veux vérifiés tableau initialisé correctement. Et aussi de se rappeler quelles boîtes sont cochées et de ne pas les perdre chaque fois que je fais défiler!

Qu'est-ce que je fais de mal?

pouvez-vous m'aider?

Merci d'avance -- Mike

25
demandé sur Community 2011-03-26 21:30:57

2 réponses

c'était délicat.

le problème est que vous appelez setChecked , activant l'ancien OnCheckedChangeListener .

le correctif est assez simple: appelez setOnCheckedChangeListener avant d'appeler setChecked . De cette façon, vous coupez le lien vers le vieil auditeur de la vue recyclé.

75
répondu Matthew Willis 2011-03-27 03:07:50

Cochez cette case pour une sélection unique de Checkbox dans Listview

AdpList adapter=new AdpList(this,array,false);
listview.setAdapter(adapter);

lorsque vous sélectionnez un article puis sur l'article CLickListener faire comme suit

listview.setonItemClickListener(new OnItemClickListener)

ici, vous obtiendrez la Position de l'article actuel

array.get(Position);

obtenir la vue de case à cocher et en cliquant sur la case à cocher, Créer une méthode dans Adaptateur, Comme

adapter.setList(true);
adapter.notifyDataSetChanged();

et dans L'Adaptateur vérifier le paramètre que je ont passé dans la méthode Setlist puis mettre la condition:

if (isChecking==true)
{
checkbox1.setChecked(true);
}else{
checkBox1.setChecked(false);
}
0
répondu Chandan kushwaha 2015-09-10 07:45:25