listview里面checkbox选中状态乱蹦+滚动listview的时候自动调用 onCheckedChanged 导致CheckBox 状态不停变化

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。
好了,到目前为止,所有问题搞定了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值