Code Bye

请教有关ListView里的CheckBox选中的问题。

我也百度了很多帖子,也试过网上的很多例子,但是依旧没能解决问题。希望能有好心人帮我看一下,不胜感激。
问题如下:ListView中的每条数据都是来自数据库,有自己的ID。现在要判断每个CHeckBox的选中状态,这个状态也是根据数据库中其他数据进行判断的(有一张表,保存了对应的ID和status标志,status表示勾选,没有勾选的则不会保存)。这两张图片是勾选后的状态,因为每一条点击后都会跳转到另一个activity(是一个填写问题的界面,如果填写了就是“查看问题”,没填写就是 “填写问题”)。问题信息是跟listview对应的每一条绑定的,因为这个listview显示的是一条条的标准。
下面是进行判断的语句:
if(!ct.isChecked){
//问题是否检查
getProblemSelected(ct.CHECKSTANDARDID);//进行数据查询获得是否勾选
//问题是否填写
getProblemDataInfo(ct.CHECKSTANDARDID);//进行数据查询,查询有没有问题记录,只查询对应的问题主键
if (problem.SHEETID !=null) {
holder.check_task_image.setText(“查看问题”);
holder.check_task_checkbox.setChecked(true);
holder.check_task_checkbox.setClickable(false);
_mList.get(index).isChecked = true;
}else if(“1”.equals(problemselected.STATUS)&&problem.SHEETID == null){
holder.check_task_image.setText(“填写问题”);
holder.check_task_checkbox.setChecked(true);
holder.check_task_checkbox.setClickable(false);
_mList.get(index).isChecked = true;
}else {
holder.check_task_image.setText(“填写问题”);
holder.check_task_checkbox.setClickable(true);
_mList.get(index).isChecked = false;
}
}
可能问题描述的不是很清晰,希望有过这方面经验的朋友能不吝赐教,不胜感激。

那到底你是现在出现了什么问题?
引用 1 楼 jiaqiangm 的回复:

那到底你是现在出现了什么问题?

额、、好像真的忘了说了,问题是这个填写问题,和查看问题一开始加载是对的,再一刷新就乱了

是跳到另一个activity回来就乱了吗
你用个hashmap去存储状态吧,,,
引用 3 楼 XiaToxic 的回复:

是跳到另一个activity回来就乱了吗

是一滑动,listview重绘之后就乱了

引用 4 楼 heaimnmn 的回复:

你用个hashmap去存储状态吧,,,

用了,勾选状态是没错,但是这个显示填写跟查看乱了

更改后怎么个乱法
引用 5 楼 fenglin0429 的回复:
Quote: 引用 3 楼 XiaToxic 的回复:

是跳到另一个activity回来就乱了吗

是一滑动,listview重绘之后就乱了

保存状态应该不会错乱的呀。。。  

引用 6 楼 fenglin0429 的回复:
Quote: 引用 4 楼 heaimnmn 的回复:

你用个hashmap去存储状态吧,,,

用了,勾选状态是没错,但是这个显示填写跟查看乱了

那就是adpter里面的postion对应不对,你debug看看getview的position是否是你要的position

40分
原因很简单,出现这情况证明你 使用缓存的 convertView,初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的view对象,不出意外是屏幕能够显示的数量+1个。   当你滑动屏幕的时候出现错乱是因为你所使用的某一个convertView里面的checkBox被选定过别的属性, 当下一个position使用这个convertView的时候checkBox应该被重新初始化一下,因为你这里
if(!ct.isChecked){}里写了逻辑 但else没有写checkBox是否被选中吧。不知道不能看懂不。
怎么个乱法。楼主贴图。就能知道是位置问题还是复用问题。干
引用 10 楼 u010718252 的回复:

原因很简单,出现这情况证明你 使用缓存的 convertView,初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的view对象,不出意外是屏幕能够显示的数量+1个。   当你滑动屏幕的时候出现错乱是因为你所使用的某一个convertView里面的checkBox被选定过别的属性, 当下一个position使用这个convertView的时候checkBox应该被重新初始化一下,因为你这里
if(!ct.isChecked){}里写了逻辑 但else没有写checkBox是否被选中吧。不知道不能看懂不。

那个你说的checkbox重新初始化一下该怎么写呢?

引用 10 楼 u010718252 的回复:

原因很简单,出现这情况证明你 使用缓存的 convertView,初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的view对象,不出意外是屏幕能够显示的数量+1个。   当你滑动屏幕的时候出现错乱是因为你所使用的某一个convertView里面的checkBox被选定过别的属性, 当下一个position使用这个convertView的时候checkBox应该被重新初始化一下,因为你这里
if(!ct.isChecked){}里写了逻辑 但else没有写checkBox是否被选中吧。不知道不能看懂不。

                        ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = mInflater.inflate(R.layout.check_task_iteminfo_list_item, null);
holder.check_task_code = (TextView) convertView.findViewById(R.id.check_task_code);
holder.check_task_content = (TextView) convertView.findViewById(R.id.check_task_content);//问题标题
holder.check_task_image = (Button) convertView.findViewById(R.id.check_task_image);//问题状态
holder.check_task_checkbox = (CheckBox) convertView.findViewById(R.id.check_task_noproblem);//
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
holder.check_task_checkbox = (CheckBox) convertView.findViewById(R.id.check_task_noproblem);
}

因为ct.isChecked的初始值是false:
                          holder.check_task_checkbox.setChecked(ct.isChecked);
if(!ct.isChecked){}

没错写对了,把分给我把。。
引用 14 楼 u010718252 的回复:

没错写对了,把分给我把。。

话说我这是第一次发帖,还真不知道怎么给分,哈哈
我已经弄好了,我在else里再执行了一次if里的东西,之前调试的时候明明没走if都能进到if里的_mList.get(index).isChecked = true;,现在我写了else就好了,再怎么刷也不报错了


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明请教有关ListView里的CheckBox选中的问题。