andorid 中带checkbox的listView问题处理

本文讨论了ListView中CheckBox选中状态在拖动时丢失的问题,并提供了通过对象记录状态的解决方案。包括处理选中回调、提供选中状态对象及设置View控件的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

带checkBox的listView会出现这样的问题:当我们选中listview中的某个条目时,拖动listView,当将选中的条目移出时,选中的信息就丢失了,同时,刚移进来的条目的状态为选中。为什么会出现这样的问题呢?这是由于仅通过控件自身来记录选中状态,而没有把选中状态记录到对象中去。所以某个条目一移出,选中的信息就丢失了。同时,移进来的条目复用了刚移出的条目,所以它会被选中。解决的办法是,通过对象bean记住状态。关键代码如下:

1、处理选中条目的回调函数。一旦选中,就把状态记录到内存数据库list中,而不是仅靠控件自身记住。
        lv_task_manager.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // 判断这个条目是否是出于选中状态.
                Object obj = lv_task_manager.getItemAtPosition(position);
                if (obj != null && obj instanceof TaskInfo) {
                    CheckBox cb = (CheckBox) view
                            .findViewById(R.id.cb_task_checked);
                    TaskInfo taskinfo = (TaskInfo) obj;
                    if (taskinfo.isChecked()) {
                        taskinfo.setChecked(false);
                        cb.setChecked(false);
                    } else {
                        taskinfo.setChecked(true);
                        cb.setChecked(true);
                    }
                }
            }
        });

2、提供选中状态的对象


        //这是提供给setOnItemClickListener方法使用的。
        public Object getItem(int position) {
            if (position == 0) {
                return null;
            } else if (position <= usertaskinfos.size()) {
                return usertaskinfos.get(position - 1);
            } else if (position == usertaskinfos.size() + 1) {
                return null;
            } else {
                return systemtaskinfos.get(position - 1 - usertaskinfos.size()
                        - 1);
            }
        }

3、设置view控件的值,重点看checkbox

ViewHolder holder;
                if (convertView != null
                        && convertView instanceof RelativeLayout) {
                    view = convertView;
                    holder = (ViewHolder) view.getTag();
                } else {
                    holder = new ViewHolder();
                    view = View.inflate(getApplicationContext(),
                            R.layout.task_item, null);
                    holder.iv_icon = (ImageView) view
                            .findViewById(R.id.iv_task_item_icon);
                    holder.tv_mem = (TextView) view
                            .findViewById(R.id.tv_task_item_mem);
                    holder.tv_name = (TextView) view
                            .findViewById(R.id.tv_task_item_name);
                    holder.cb = (CheckBox) view
                            .findViewById(R.id.cb_task_checked);
                    view.setTag(holder);
                }
                TaskInfo taskinfo = usertaskinfos.get(position - 1);
                holder.iv_icon.setImageDrawable(taskinfo.getIcon());
                holder.tv_mem.setText(Formatter.formatFileSize(
                        getApplicationContext(), taskinfo.getMemsize()));
                holder.tv_name.setText(taskinfo.getName());
                //如果是一个新的位置(以前没有出来过)时,就会默认赋值为false(成员变量默认赋初值)
                //如果是之前出来过的位置,由于之前把 position位置的选中结果存在了taskinfo中,这次可以找回来。
                holder.cb.setChecked(taskinfo.isChecked());


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值