您的位置:首页 > 其它

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)右下角出现电话图标



 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。

好了,到目前为止,所有问题搞定了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐