在listview中的arrayadapter中取消选中复选框

时间:2014-09-08 08:21:10

标签: android checkbox android-arrayadapter

向下滚动时,CheckBox会自动取消选中 这是我的以下代码:

  package com.serial.teach;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.TextView;
import android.widget.Toast;

public class TeachAdapter extends ArrayAdapter<String> {
    Context context;
    ArrayList<String> roll =new ArrayList<String>();
    ArrayList<String> checkbox=new ArrayList<String>();
    private int lastPosition = -1;
    private int counter = 0;
    ArrayList<Boolean> status = new ArrayList<Boolean>();
    public static List<Integer> SelectedBox = new ArrayList<Integer>();
    Animation animation;
    View row;
    public TeachAdapter(Context c,ArrayList<String> r, ArrayList<String> ch) {
        super(c, R.layout.single_rows, R.id.name, ch);
        // TODO Auto-generated constructor stub
        this.context = c;
        this.roll = r;
        this.checkbox = ch;
        for (int i = 0; i < roll.size(); i++) {
            status.add(false);
        }

    }

    class MyViewHolder {
        TextView tv;
        CheckBox cb;

        public MyViewHolder(View v) {
            // TODO Auto-generated constructor stub
            tv = (TextView) v.findViewById(R.id.roll);
            cb = (CheckBox) v.findViewById(R.id.name);
        }
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        row = convertView;
        final MyViewHolder holder;
        if (row == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.single_rows, parent, false);
            holder = new MyViewHolder(row);
            row.setTag(holder);
        } else {
            holder = (MyViewHolder) row.getTag();
        }

        animation = AnimationUtils.loadAnimation(getContext(),
                (position > lastPosition) ? R.anim.up_from_bottom
                        : R.anim.abc_fade_in);
        //down_from_top
        row.startAnimation(animation);
        lastPosition = position;

        holder.tv.setText(roll.get(position));
        holder.cb.setText(checkbox.get(position));
        holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
                // TODO Auto-generated method stub

                if (holder.cb.isChecked()) {    
                    status.set(position, true);
                    SelectedBox.add(Integer.parseInt((roll.get(position))));
                    Toast.makeText(getContext(), "You selected " + roll.get(position)+" "+ checkbox.get(position),
                            Toast.LENGTH_SHORT).show();
                    holder.cb.setTextColor(Color.rgb(0, 255, 0));
                } else {
                    status.set(position, false);

                    Toast.makeText(getContext(), "You unchecked " + position,
                            Toast.LENGTH_SHORT).show();
                   holder.cb.setTextColor(Color.rgb(255, 0, 0));

                }
            }
        });
        holder.cb.setChecked(status.get(position));
        holder.cb.setTag(position);
        return row;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return super.getCount();
    }

    @Override
    public String getItem(int position) {
        // TODO Auto-generated method stub
        return super.getItem(position);
    }

}

我有一个textView和一个像这样的复选框:

TV   |_|Checkbox 
TV   |_|Checkbox
TV   |_|Checkbox
TV   |_|Checkbox
TV   |_|Checkbox

但是对于许多项目,当我选择自动取消选择时。

我的布局包含一个textView和一个CheckBox,如上所述

2 个答案:

答案 0 :(得分:0)

列表元素由适配器中的getView()函数查看,当它们出现在屏幕的可见部分时会重新生成。您的复选框可能会被选中,但当它退出屏幕时,此信息将被回收。当它再次出现在屏幕中时,getView()方法再次起作用,并且显示为未选中。但是,这只是外观,这意味着,您在后台制作的与checkBox相关的任何编程算法仍然有效。如果你想保留checkBoxes的外观,你应该保留一个包含状态的布尔值列表。

例如,创建一个布尔列表checkedBefore。在每个checkBox操作中相应地填写此列表。 position方法中的getView()参数是列表中的索引。然后,您可以使用以下代码每次都正确显示复选框;

if( checkedBefore(position) ){              
    checkBox.setChecked(true);
}

答案 1 :(得分:0)

这是因为一次又一次地调用getview。为了防止它,你必须保留复选框的状态。THIS链接帮助了我,它也会帮助你。这是最好的解决方案 我发现。我无法粘贴代码,因为它太大了。它是关于这个问题的完整博客