32 votes

Case à cocher appel automatique sur CheckedChange lorsque la liste défile?

J'ai un problème avec listview qui élément de la liste contient une case à cocher. Quand je coche une case et faites défiler la liste, case à cocher, parfois, l'appel automatique oncheckedchange et la valeur de la case est changé!

Ou, quand a ma liste de plus de 9 ou 10 de l'élément, puis quand j'ai vérifié à l'article 1, point 8 ou 9 est-elle vérifiée???

Quelqu'un peut me dire ce que dois-je corriger ce bug?

Merci à l'avance!

list_item.xml

<ImageView
    android:layout_alignParentLeft="true"
    android:layout_width="36dip"
    android:layout_height="36dip"
    android:layout_centerVertical="true"
    android:scaleType="fitCenter"
    android:id="@+id/image_view"
    android:src="@drawable/icon" />

<TextView android:layout_toRightOf="@id/image_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="5dip"
    android:id="@+id/text_view"
    android:lines="1"
    android:textSize="20sp"
    android:textColor="@color/white" />

<TextView android:layout_toRightOf="@id/image_view"
    android:layout_below="@id/text_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="5dip"
    android:id="@+id/text_view2"
    android:textSize="14sp"
    android:lines="1"
    android:textColor="@color/white" />          

et voici l'adaptateur d'affichage:

    public View getView(int position, View convertView, ViewGroup parent) {
        Log.e(TAG, "getView");
        ViewHolder mViewHolder;
        if (convertView == null) {
            Log.e(TAG, "Inflater is inflating...");
            convertView = mInflater.inflate(R.layout.custom_list_app, null);
            mViewHolder = new ViewHolder();
            mViewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.checkbox);
            mViewHolder.remove = convertView.findViewById(R.id.music_info);
            convertView.setTag(mViewHolder);
        } else {
            mViewHolder = (ViewHolder) convertView.getTag();
            Log.e(TAG, "Position: " + position + " CheckBox: " + mViewHolder.checkbox.isChecked());
        }   
        mViewHolder.checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton cb, boolean flag) {
                // TODO Auto-generated method stub
                if (flag) {
                    Log.d(TAG, "Checkbox checked");
                } else {
                    Log.d(TAG, "Checkbox un-checked");
                }
            }
        });


        return convertView;
    }

74voto

Femi Points 42054

ListView recycle les classes de vue: vous devrez définir explicitement si CheckBox est coché dans la classe getView . Alors ajoutez un chèque comme

 /**
*    Ensure no other setOnCheckedChangeListener is attached before you manually
*    change its state.
*/
mViewHolder.checkbox.setOnCheckedChangeListener(null);
if(shouldBeChecked) mViewHolder.checkbox.setChecked(true);
else mViewHolder.checkbox.setChecked(false);
 

avant d'appeler setOnCheckedChangeListener .

5voto

lixiaodaoaaa Points 22
 holder.cBox.setOnCheckedChangeListener(null);
holder.cBox.setChecked(list.get(position).isChecked());
holder.tvName.setText(item.getName());

holder.cBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        if (isChecked)
        {
            list.get(position).setChecked(true);
        }
        else
        {
            list.get(position).setChecked(false);
        }
    }
});
 

Dans la liste, l'élément a un attribut pour définir si l'élément est vérifié ou non. Vous pouvez l'utiliser pour définir votre élément s'il est coché, et vous devez d'abord définir le

 cBox.setOnCheckedChangeListener(null);
cBox.setChecked(list.get(position).isChecked());
 

Réglez ensuite le vrai new OnCheckedChangeListener()

J'espère que ma réponse vous sera utile, à vous et à ceux qui consultent cette page ou qui ont du mal à gérer les vues de liste comportant des cases à cocher.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X