关于ListView+CheckBox,Item超过一屏时数据乱序和不能全部选中的问题

最近在做listview+checkbox,遇到问题,下面这个不错。



最近在进行项目调试,之前因为没有进行大量数据测试,没有发现ListView+CheckBox数据超屏是不能全部选中和CheckBox选中状态跳来跳去的BUG。在网上找了很多资料,因为后台数据的问题,基本上都不能为我所用。现在终于解决了这个问题。。先用博客记下,免得以后麻烦。

=====================================转载请添加原文地址==================================
ListView+CheckBox数据超过一屏时数据乱序的原因主要是重新加载了contentview。当第一次加载convertView为null,而再有新的View就会发现convertView不为空,所以新显示的View其实使用了之前某个View的对象。这就造成了状态可能混乱。比如你的listview可以显示7个item,第一行的checkbox点选时,第8行的也同时会被点选。
解决方案:当选择Checkbox的时候,记下其状态,然后在getView方法中进行设置 。
下面给出项目适配器部分代码(红色部分为关键代码):

<span style="color: rgb(8, 68, 135);">public class CheckRecycleIntoListAdapter extends BaseAdapter {
ArrayList<MyRecycleBoxPerson> lt;// 填充数据的list
Context context;// 上下文
</span><span style="color: rgb(255, 0, 0);">List<Integer> checkPosition ;</span><span style="color: rgb(8, 68, 135);">
public CheckRecycleIntoListAdapter(Context ct,
ArrayList<MyRecycleBoxPerson> list) {
this.context = ct;
this.lt = list;
</span><span style="color: rgb(255, 0, 0);">checkPosition = new ArrayList<Integer>();</span><span style="color: rgb(8, 68, 135);">
}
public int getCount() {
return lt.size();
}
public Object getItem(int position) {
return lt.get(position);
}
public long getItemId(int position) {
return position;
}
public ArrayList<MyRecycleBoxPerson> getMlist() {
return lt;
}
public void setMlist(ArrayList<MyRecycleBoxPerson> myRecycleBoxPerson) {
this.lt = myRecycleBoxPerson;
}
public View getView(int position, View convertView, ViewGroup parent) {
final int cPosition = position;
// 初始化数据
ViewHolder holder = null;
int unread = 0;
holder = new ViewHolder();// 实例化控件
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(
R.layout.recycle_into_listitem, null);
}
// 初始化组件
holder.v_recycle_into_isChecked = (CheckBox) convertView
.findViewById(R.id.recycle_into_isChecked);
holder.v_recycle_into_name = (TextView) convertView
.findViewById(R.id.recycle_into_name);
convertView.setTag(holder);
</span><span style="color: rgb(255, 0, 0);">holder.v_recycle_into_isChecked.setTag(new Integer(position));
if (checkPosition != null){  
holder.v_recycle_into_isChecked.setChecked((checkPosition.contains(new Integer(position)) ? true : false));   
            }else
           {  
            holder.v_recycle_into_isChecked.setChecked(false);   
            }  </span><span style="color: rgb(8, 68, 135);">
final CheckBox finalholder = holder.v_recycle_into_isChecked;
</span><span style="color: rgb(255, 0, 0);">holder.v_recycle_into_isChecked.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked){ 
                       if (!checkPosition.contains(finalholder.getTag())){  
                           checkPosition.add((Integer)finalholder.getTag());  
                       thread_id_List.add(lt.get(cPosition)
.getThread_id());
System.out.println("thread_id_List.size()------wai------>"+thread_id_List);
                       }  
                   }else{  
                       if (checkPosition.contains(finalholder.getTag())){  
                           checkPosition.remove(finalholder.getTag());  
                           thread_id_List.remove(lt.get(cPosition)
    .getThread_id());
    System.out.println("thread_id_List.size()------wai------>"+thread_id_List);
                       }  
                   }  
recycle_number.setText("选中("
+ thread_id_List.size() + ")");
}
});</span><span style="color: rgb(8, 68, 135);">
// 给控件入值
holder.v_recycle_into_name.setText(lt.get(position).getPersonName()
+ "(" + smsNum + ")");
return convertView;
}
}
}</span>

ListView+CheckBox数据超屏时不能全部选中的问题,网上找的资料都是只全选已经加载显示的item,而实际上我要实现的需求是要加载全选全部item。如果能够加载全选全部item,那这个问题也就解决了。而最终我的解决方案也就像我想的一样。完美解决。
解决方案:加载全部item,给checkbox设置,更新adapter。
下面给出关键代码(红色部分为关键代码):
<span style="color: rgb(8, 68, 135);">selectall.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
</span><span style="color: rgb(255, 0, 0);">if (isChecked) {
for(int index=0;index< adapter.getCount();index++){
View view = adapter.getView(index, null, null);
 CheckBox checkBox = (CheckBox) view.findViewById(R.id.recycle_into_isChecked);
 checkBox.setChecked(true);
recycle_number.setText("选中("
+ thread_id_List.size() + ")");
}
adapter.notifyDataSetChanged();
} else 
{
for (int index = 0; index < adapter.getCount(); index++) {
View view = adapter.getView(index, null, null);
CheckBox checkBox = (CheckBox) view
.findViewById(R.id.recycle_into_isChecked);
recycle_number.setText("选中(0)");
checkBox.setChecked(false);
}
adapter.notifyDataSetChanged();
}</span><span style="color: rgb(8, 68, 135);">
}
});</span>
<span style="color: rgb(8, 68, 135);">
</span>
<span style="color: rgb(8, 68, 135);">转:http://blog.csdn.net/djcken/article/details/7658656</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值