checkBox有问题

时间:2011-07-27 14:32:25

标签: android select checkbox

我的复选框有一个奇怪的问题。在我的适配器中,我有一个TextView,一个ImageView和一个CheckBox。我已经实现了一个选择全部/取消选择所有的按钮,一切正常。问题是,当我选择一个复选框时,如果我滚动列表,则选择了其他复选框(它们之间的距离为10),我不明白为什么。任何人都可以帮助我吗?

这是我的适配器:

public class LazyAdapter extends BaseAdapter {

        private Activity activity;
        private String[] data;
        private String[] nume;
        private LayoutInflater inflater = null;
        public ImageLoader imageLoader;

        public LazyAdapter(Activity a, String[] d, String[] f) {
            activity = a;
            data = d;
            nume = f;
            inflater = (LayoutInflater) activity
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            imageLoader = new ImageLoader(activity.getApplicationContext(),"Folder2");
        }

        public int getCount() {
            return data.length;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public class ViewHolder {
            public TextView text;
            public ImageView image;
            public CheckBox ck;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            View vi = convertView;
            ViewHolder holder;
            if (convertView == null) {
                vi = inflater.inflate(R.layout.item, null);
                holder = new ViewHolder();
                holder.text = (TextView) vi.findViewById(R.id.text);
                holder.image = (ImageView) vi.findViewById(R.id.image);
                holder.ck = (CheckBox) vi.findViewById(R.id.chkbox);
                if (flag)
                    holder.ck.setChecked(true);
                else
                    holder.ck.setChecked(false);

                vi.setTag(holder);
            } else
                holder = (ViewHolder) vi.getTag();

            holder.text.setText(nume[position]);
            holder.image.setTag(data[position]);
            imageLoader.DisplayImage(data[position], activity, holder.image);
            return vi;
        }

    }

2 个答案:

答案 0 :(得分:2)

列表中的视图已被回收。您的数据列表可能有100行,但ListView只有10行(这些可见行)。滚动时,行将被回收。 ListView中的最后一行转到第一个位置或另一个方向。您必须更改这些行的状态。 您需要将复选框状态保留在数组中,而不是视图中。

添加

        final List<Boolean> isCheckedList;

在构造函数中初始化它:

        isCheckedList = new ArrayList<Boolean>();
        for(int i=0;i<myDataLength;i++){
            isCheckedList.add(Boolean.FALSE);
        }

并修改getView:

        holder.ck.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                isCheckedList.set(position, holder.ck.isChecked());
            }
        });

在您填充行的位置:

        holder.ck.setChecked(isCheckedList.get(position));

要更改所有复选框的状态,请使用:

        Collections.fill(isCheckedList, Boolean.FALSE);
        notifyDataSetChanged();

答案 1 :(得分:1)

您需要移动此代码:

    if (flag)
         holder.ck.setChecked(true);
    else
         holder.ck.setChecked(false);

超出if{}区块。