listview里面checkbox选中状态乱蹦+滚动listview的时候自动调用 onCheckedChanged 导致CheckBox 状态不停变化
2014-03-19 10:15
375 查看
listview里面checkbox选中状态乱蹦+滚动listview的时候自动调用 onCheckedChanged 导致CheckBox
状态不停变化
前几天做项目,listview里面有checkbox,然后就遇到问题了,我看用viewholder之后,效率是解决了,但是里面加其他控件的时候,容易出现各种问题。特别是乱蹦的问题,应该是异步机制导致的。(详见:listview图片乱动分析)
我的问题见图:(项目需求:选中多于1个item的时候,右下角出现打电话的按钮。党一个都没选择的时候,隐藏按钮)。
1.选择一个checkbox。(aaa2)右下角出现电话图标
![](https://img-blog.csdn.net/20140319131350750?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemExNDM1NjcyMjl6YQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2.滑动listview,当盖住(aaa2)的的时候,右下角的电话图标消失,说明checkbox 的选中状态消失。
![](https://img-blog.csdn.net/20140319131407703?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemExNDM1NjcyMjl6YQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
3.再次把(aaa2)显示出来,选中状态消失。
![](https://img-blog.csdn.net/20140319131425875?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemExNDM1NjcyMjl6YQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
4.还有个状态网连接图了,就是,再次滑动,随机可能出现某一个item有变成选中了,这个是不确定的item。
这个有个解决办法:
PS:红色部分的代码,是解决问题的主要代码。
注意,1.要是在项目中,出现了下标跃出的错误,那就是
for (int i = 0; i < mlist.size(); i++) {
checkPositionor.add(false);
}
mlist.size()这个小了,自己根据自己的项目设置大小或则动态设置。
2.还有一个就是因为设置了setid(),所以item布局不能用相对布局,我改用了线性布局。
当然,写在这里的时候,新的问题出现了,就是要解决的第二大问题。
这个问题是,当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化。
我发现当选中之后,滑动listview,然后checkbox的oncheckedchanged方法是疯狂调用,你可以打log或者syso,就可以发现这个问题了。这就导致了,当我把选中的几个item滑动到不可见的时候,我右下角的打电话就消失了。
解决办法很简单:
//在初始化CheckBox状态和设置状态变化监听事件之前,先把状态变化监听事件设置为null
viewHolder.listviewdelete_item_checkbox3.setOnCheckedChangeListener(null);
viewHolder.listviewdelete_item_checkbox3.setId(position);
viewHolder.listviewdelete_item_checkbox3.setChecked(checkBoxStatus);
viewHolder.listviewdelete_item_checkbox3.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// if (buttonView.getId() == Integer.parseInt((Integer)
// finalholder.getTag() + "")) {
// System.out.println("hahhahahahhaahahh");
if (isChecked) {
ischeckedsize = ischeckedsize + 1;
System.out.println("选择了-1--ischeckedsize==" + ischeckedsize);
// mHandler.obtainMessage(UPDATEISCHECKEDSIZE).sendToTarget();
} else {
ischeckedsize = ischeckedsize - 1;
System.out.println("没选择-2--ischeckedsize==" + ischeckedsize);
}
System.out.println("-3--ischeckedsize==" + ischeckedsize);
mHandler.obtainMessage(UPDATEISCHECKEDSIZE, ischeckedsize).sendToTarget();
checkPositionor.set(buttonView.getId(), isChecked);
notifyDataSetChanged();
// }
}
});
只需要在初始化CheckBox状态和设置状态变化监听事件之前,先把状态变化监听事件设置为null。
好了,到目前为止,所有问题搞定了。
状态不停变化
前几天做项目,listview里面有checkbox,然后就遇到问题了,我看用viewholder之后,效率是解决了,但是里面加其他控件的时候,容易出现各种问题。特别是乱蹦的问题,应该是异步机制导致的。(详见:listview图片乱动分析)
我的问题见图:(项目需求:选中多于1个item的时候,右下角出现打电话的按钮。党一个都没选择的时候,隐藏按钮)。
1.选择一个checkbox。(aaa2)右下角出现电话图标
2.滑动listview,当盖住(aaa2)的的时候,右下角的电话图标消失,说明checkbox 的选中状态消失。
3.再次把(aaa2)显示出来,选中状态消失。
4.还有个状态网连接图了,就是,再次滑动,随机可能出现某一个item有变成选中了,这个是不确定的item。
这个有个解决办法:
<span style="color:#57697d;">class MyBaseAdapter extends BaseAdapter { private List<String> mlist = new ArrayList<String>(); </span><span style="color:#ff0000;">List<Integer> checkPosition = null;// checkbox选中的位置。</span><span style="color:#57697d;"> public MyBaseAdapter(List<String> list) { mlist = list; </span><span style="color:#ff0000;">checkPosition = new ArrayList<Integer>(); checkPositionor = new ArrayList<Boolean>(); for (int i = 0; i < mlist.size(); i++) { checkPositionor.add(false); }</span><span style="color:#57697d;"> } public List<Boolean> getCheckBoxesStatus() { return checkPositionor; } @Override public int getCount() { // TODO Auto-generated method stub return mlist.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return mlist.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { Boolean checkBoxStatus = checkPositionor.get(position); ViewHolder viewHolder = null; if (convertView == null) { viewHolder = new ViewHolder(); convertView = LayoutInflater.from(context).inflate(R.layout.listiviewdelete_item3, null); viewHolder.listviewdelete_item_text3 = (TextView) convertView.findViewById(R.id.listviewdelete_item_text3); viewHolder.listviewdelete_item_checkbox3 = (CheckBox) convertView.findViewById(R.id.listviewdelete_item_checkbox3); convertView.setTag(viewHolder); </span><span style="color:#ff0000;">viewHolder.listviewdelete_item_checkbox3.setTag(new Integer(position));// 做标记</span><span style="color:#57697d;"> } else { viewHolder = (ViewHolder) convertView.getTag(); } </span><span style="color:#ff0000;">viewHolder.listviewdelete_item_checkbox3.setId(position); viewHolder.listviewdelete_item_checkbox3.setChecked(checkBoxStatus);</span><span style="color:#57697d;"> viewHolder.listviewdelete_item_checkbox3.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // if (buttonView.getId() == Integer.parseInt((Integer) // finalholder.getTag() + "")) { // System.out.println("hahhahahahhaahahh"); if (isChecked) { ischeckedsize = ischeckedsize + 1; System.out.println("选择了-1--ischeckedsize==" + ischeckedsize); // mHandler.obtainMessage(UPDATEISCHECKEDSIZE).sendToTarget(); } else { ischeckedsize = ischeckedsize - 1; System.out.println("没选择-2--ischeckedsize==" + ischeckedsize); } System.out.println("-3--ischeckedsize==" + ischeckedsize); mHandler.obtainMessage(UPDATEISCHECKEDSIZE, ischeckedsize).sendToTarget(); checkPositionor.set(buttonView.getId(), isChecked); notifyDataSetChanged(); // } } }); return convertView; } } final static class ViewHolder { TextView listviewdelete_item_text3; Button listviewdelete_item_BT_delete3; CheckBox listviewdelete_item_checkbox3; }</span>
PS:红色部分的代码,是解决问题的主要代码。
注意,1.要是在项目中,出现了下标跃出的错误,那就是
for (int i = 0; i < mlist.size(); i++) {
checkPositionor.add(false);
}
mlist.size()这个小了,自己根据自己的项目设置大小或则动态设置。
2.还有一个就是因为设置了setid(),所以item布局不能用相对布局,我改用了线性布局。
当然,写在这里的时候,新的问题出现了,就是要解决的第二大问题。
这个问题是,当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化。
我发现当选中之后,滑动listview,然后checkbox的oncheckedchanged方法是疯狂调用,你可以打log或者syso,就可以发现这个问题了。这就导致了,当我把选中的几个item滑动到不可见的时候,我右下角的打电话就消失了。
解决办法很简单:
//在初始化CheckBox状态和设置状态变化监听事件之前,先把状态变化监听事件设置为null
viewHolder.listviewdelete_item_checkbox3.setOnCheckedChangeListener(null);
viewHolder.listviewdelete_item_checkbox3.setId(position);
viewHolder.listviewdelete_item_checkbox3.setChecked(checkBoxStatus);
viewHolder.listviewdelete_item_checkbox3.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// if (buttonView.getId() == Integer.parseInt((Integer)
// finalholder.getTag() + "")) {
// System.out.println("hahhahahahhaahahh");
if (isChecked) {
ischeckedsize = ischeckedsize + 1;
System.out.println("选择了-1--ischeckedsize==" + ischeckedsize);
// mHandler.obtainMessage(UPDATEISCHECKEDSIZE).sendToTarget();
} else {
ischeckedsize = ischeckedsize - 1;
System.out.println("没选择-2--ischeckedsize==" + ischeckedsize);
}
System.out.println("-3--ischeckedsize==" + ischeckedsize);
mHandler.obtainMessage(UPDATEISCHECKEDSIZE, ischeckedsize).sendToTarget();
checkPositionor.set(buttonView.getId(), isChecked);
notifyDataSetChanged();
// }
}
});
只需要在初始化CheckBox状态和设置状态变化监听事件之前,先把状态变化监听事件设置为null。
好了,到目前为止,所有问题搞定了。
相关文章推荐
- android 当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化 的解决办法
- android 当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化 的解决办法
- android 当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化
- android 当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化 的解决办法
- android ListView/Recyclerview滚动时自动调用onCheckedChanged导致CheckBox状态混乱的解决办法
- android ListView/Recyclerview滚动时自动调用onCheckedChanged导致CheckBox状态混乱的解决办法
- android 当ListView滚动时自动调用 onCheckedChanged
- 如何记录ListView滚动后CheckBox保持选中状态以及当全选后让滚动出来的item也被选中
- E/JavaBinder:FAILED BINDER TRANSACTION错误解决+RadioGroup调用check方法的时候,onCheckedChanged被调用多次的问题解决
- ListView 复用导致 CheckBox 选中状态错乱
- Listview上的checkbox重复和滚动自动调用chexkbox设置监听
- Android中ListView包含CheckBox时滑动丢失选中状态的解决
- RadioGroup调用setcheck(bool)方法时,onCheckedChanged方法被执行多次解决办法
- 调用RadioGroup的check(id)方法,监听onCheckedChanged方法被执行多次;调用clearCheck(),onCheckedChanged方法仍被执行的解决办法
- Android中ListView包含CheckBox时滑动丢失选中状态的解决
- ListView 里面的checkBox,当其中一个被选中,其余全不被选中
- 无法datalist里面的CheckBox控件选中状态
- android聊天的时候让listview最新消息自动滚动到可视范围之内
- 请问ListView里面含有CheckBox,为什么滚动时会错乱
- ListView嵌套CheckBox滑动时CheckBox选中状态错乱