问题复选框 [英] Problem with checkBox

查看:145
本文介绍了问题复选框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我和我的复选框,一个奇怪的问题。在我的适配器我有一个TextView,一个ImageView的和一个复选框。我不得不实行按钮选择所有/取消选择所有,一切工作正常。问题是,当我选择一个复选框,如果我滚动列表还有和其他复选框选中(它们之间的距离是10),我不明白为什么。谁能帮我?

下面是我的适配器:

 公共类LazyAdapter延伸BaseAdapter {        私人活动活动;
        私有String []的数据;
        私有String [] nume;
        私人LayoutInflater吹气= NULL;
        公共ImageLoader的ImageLoader的;        公共LazyAdapter(活动一,的String [] D,的String [] F){
            活性=一个;
            数据= D;
            nume = F;
            吹气=(LayoutInflater)活动
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            ImageLoader的=新ImageLoader的(activity.getApplicationContext(),FOLDER2);
        }        公众诠释的getCount(){
            返回data.length;
        }        公共对象的getItem(INT位置){
            返回的位置;
        }        众长getItemId(INT位置){
            返回的位置;
        }        公共类ViewHolder {
            公众的TextView文本;
            公众形象ImageView的;
            公共复选框CK;
        }        公共查看getView(INT位置,查看convertView,父母的ViewGroup){
            查看VI = convertView;
            ViewHolder持有人;
            如果(convertView == NULL){
                VI = inflater.inflate(R.layout.item,NULL);
                持有人=新ViewHolder();
                holder.text =(TextView中)vi.findViewById(R.id.text);
                holder.image =(ImageView的)vi.findViewById(R.id.image);
                holder.ck =(复选框)vi.findViewById(R.id.chkbox);
                如果(标志)
                    holder.ck.setChecked(真);
                其他
                    holder.ck.setChecked(假);                vi.setTag(保持器);
            }其他
                支架=(ViewHolder)vi.getTag();            holder.text.setText(nume [位置]);
            holder.image.setTag(数据[位置]);
            imageLoader.DisplayImage(数据[位置],活动,holder.image);
            返回VI;
        }    }


解决方案

在列表视图进行再生利用。您的数据所列内容可能有100行,但的ListView 只有10(这些可见)的行。滚动时,行回收。在的ListView 最后一行前进到第一位置或其他方式。你必须改变这些行的状态。
你需要保持复选框状态阵列,而不是意见。

添加

 最终名单,LT;布尔> isCheckedList;

在构造函数初始化:

  isCheckedList =新的ArrayList<布尔>();
        的for(int i = 0; I< myDataLength;我++){
            isCheckedList.add(Boolean.FALSE);
        }

和修改getView:

  holder.ck.setOnClickListener(新OnClickListener(){            @覆盖
            公共无效的onClick(视图v){
                isCheckedList.set(位置,holder.ck.isChecked());
            }
        });

在的地方,你填写行:

  holder.ck.setChecked(isCheckedList.get(位置));

要改变所有复选框状态下使用:

  Col​​lections.fill(isCheckedList,Boolean.FALSE);
        notifyDataSetChanged();

I have a strange problem with my checkbox. In my adapter I have a TextView, an ImageView and a CheckBox. I had implement a button for select all/deselect all and everything works fine. The problem is that when I select one checkbox, if I scroll the list there are and other checkbox selected(the distance between them is 10) and I don't understand why. Can anyone help me?

Here is my adapter :

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;
        }

    }

解决方案

Views in list are recycled. Your data list may has 100 rows, but ListView has only 10 (these visible) rows. When you scroll, rows are recycled. The last row in ListView goes to the first position or the other way. You have to change the state of these rows. You need to keep checkbox state in array, not in views.

Add

        final List<Boolean> isCheckedList;

initialize it in constructor:

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

and modify getView:

        holder.ck.setOnClickListener(new OnClickListener() {

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

in place where you fill rows:

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

To change state of all checkboxes use:

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

这篇关于问题复选框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆