android 当ListView滚动时自动调用 onCheckedChanged 导致CheckBox 状态不停变化 的解决办法 ...

今天在做一个含有CheckBox 的ListView时,发现当初始化CheckBox的状态后, 滚动ListView,其中CheckBox 的选中状态不停的发生变化。最后发现原因是 ListView滚动时自动调用 onCheckedChanged 导致的。在查看了各种博客的解决办法后,国外的网站上有一个办法解决了我的问题。写下来分享一下。

 

在自定义Adapter的getView方法中这样写就行了。

 

//在初始化CheckBox状态和设置状态变化监听事件之前,先把状态变化监听事件设置为null
holder.checkBox.setOnCheckedChangeListener(null);
//然后设置CheckBox状态
if(isChecked) {
	holder.checkbox.setChecked(true);
} else {
	holder.checkbox.setChecked(false);
}
//然后设置状态变化监听事件
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ 
	@Override 
	public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
		if(isChecked){ 
			//...
		}else{ 
			//....
		}
	} 
}); 
 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,当 ListView 滚动,会导致 CheckBox 的选中状态消失。这是因为 ListView 会对其子项进行复用,从而导致 CheckBox状态丢失。 为了解决这个问题,可以在 Adapter 中使用 ViewHolder 模式来缓存 ListView 的子项,从而避免 CheckBox 状态的丢失。具体来说,ViewHolder 模式可以通过以下步骤来实现: 1. 在 Adapter 中定义一个 ViewHolder 类,用于缓存 ListView 的子项: ```java private static class ViewHolder { TextView nameTextView; CheckBox checkBox; } ``` 2. 在 getView 方法中使用 ViewHolder 对象来缓存 ListView 的子项: ```java @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false); viewHolder = new ViewHolder(); viewHolder.nameTextView = convertView.findViewById(R.id.name_text_view); viewHolder.checkBox = convertView.findViewById(R.id.checkbox); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } // 设置子项的文本和 CheckBox 状态 MyItem item = getItem(position); viewHolder.nameTextView.setText(item.getName()); viewHolder.checkBox.setChecked(item.isChecked()); // 返回子项视图 return convertView; } ``` 在这个例子中,我们首先通过 convertView 参数来获取 ListView 的子项视图。如果 convertView 为 null,说明当前子项没有被缓存,我们就需要创建一个新的 ViewHolder 对象,并使用 setTag 方法将其绑定到 convertView 上。如果 convertView 不为 null,说明当前子项已经被缓存了,我们就可以直接从 convertView 中获取 ViewHolder 对象。 在 getView 方法中,我们通过 ViewHolder 对象来设置子项的文本和 CheckBox 状态。由于 CheckBox状态已经被缓存到 ViewHolder 中,因此即使 ListView 滚动CheckBox状态也不会丢失。 最后,我们返回子项视图 convertView。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值