2017-07-26 1 views
0

Chaque fois que défiler vers le haut et vers le bas, je perds vérifier l'état de la case à cocher.Android perdu de vérifier l'état après le défilement

Je ne peux pas résoudre ce problème pendant deux jours ......

S'il vous plaît aidez-moi

Voici mon code.

public View getView(final int position, View view, ViewGroup parent) { 

    context = parent.getContext(); 

    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 


    if (view == null) { 

     holder = new ViewHolder(); 

     view = inflater.inflate(R.layout.custom_llistview, parent, false); 

     holder.img_view = (ImageView) view.findViewById(R.id.custom_imageView); 
     holder.txt_view = (TextView) view.findViewById(R.id.custom_textView); 
     holder.checkbox = (CheckBox) view.findViewById(R.id.check_box); 

     view.setTag(holder); 
    } 
    else { 
     holder = (ViewHolder)view.getTag(); 

    } 

    holder.checkbox.setChecked(check_flag_arr[position]); 

    holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked) { 

       check_flag_arr[position] = isChecked; 
      else { 
       check_flag_arr[position] = isChecked; 
      } 
     } 
    }); 

    file_path = list_item.get(position).getFile_path(); 
    Bitmap showImage = BitmapFactory.decodeFile(file_path); 

    holder.img_view.setImageBitmap(showImage); 

    list_contents = file_path.substring(45, 65); 
    holder.txt_view.setText(list_contents); 

    return view; 
} 

Et l'explication détaillée sera un grand plaisir pour moi.

Je dois résoudre ce problème.

Merci d'avoir regardé mon message.

+0

Votre si et les autres font la même chose. Donc cela devient redondant. Ce n'est pas la cause de votre problème mais je voulais juste vous le faire savoir. if (isChecked) { check_flag_arr [position] = isChecked; else { check_flag_arr [position] = isChecked; } –

+0

Merci pour votre commentaire. Mais je le sais déjà. C'est pour la lisibilité à moi. Mon code original a différentes déclarations dans if et else respectivement. –

+0

@ Na Jun Yeop Vérifiez ma réponse ci-dessous. Cela devrait fonctionner pour vous –

Répondre

1

Lorsque vous faites défiler, setOnCheckedChangeListener est appelée. Donc, pour gérer cela en vue get que vous devez faire le ci-dessous -

holder.checkbox.setOnCheckedChangeListener(null); 
holder.checkbox.setChecked(_songs.get(position).isSelected()); 

Vous devez d'abord configurer null onchecked afin que le défilement lorsque la vue devient peuplée et vous assignez des vues, vous ne communiquez pas avec le onCheckedListener .

Et alors vous devez appeler OnCheckedChangeListener

holder.checkbox.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       if (holder.checkbox.isChecked()) { 
        check_flag_arr[position] = true; 
       } else { 
        check_flag_arr[position] = false; 
       } 
      } 
     }); 
+0

Merci, mais cela ne fonctionne pas. Je définis d'abord null sur onClickListener, puis définissez la valeur de vérification. Après cela, j'ai appelé setOnClickListener. Est-ce que je fais bien? –

+0

Je ne peux pas comprendre le mécanisme. Je stocke la valeur de vérification chaque fois que onClickListener est appelé. Et puis quand getView est appelé à nouveau, je définis la valeur de contrôle comme je l'ai stocké avant. Qu'est-ce qui ne va pas? –

+0

J'ai résolu !!!!!!!!!!!!!!!!! Merci beaucoup. Si je ne définis pas OncheckedChangedListener null, la vue recyclée suivante obtient la valeur de vérification précédente? Est-ce la raison de l'établissement de null? –

2

Chaque fois que vous faites défiler setOnCheckedChangeListener est appelée.

Retrait setOnCheckedChangeListener et met en œuvre setOnClickListener

holder.checkbox.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        if (holder.checkbox.isChecked()) { 
         check_flag_arr[position] = true; 
        } else { 
         check_flag_arr[position] = false; 
        } 
       } 
      }); 
+0

Changé mieux !! Merci, mais ça ne fonctionne pas correctement. Quel est le problème?? –