`
yidongkaifa
  • 浏览: 4069718 次
文章分类
社区版块
存档分类
最新评论

andorid 中带checkbox的listView问题处理

 
阅读更多

带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());


分享到:
评论
Global site tag (gtag.js) - Google Analytics