Android ListView Adapter中checkbox 勾选位置错乱

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

假如ListView,分成2页(或者设置数据可以纵向拉,可隐藏),每页3条数据,每个Listview的Item 里面有个checkBox,现在,当我选择第一页的前两天数据,翻到第二页,竟然第二页后两条数据也选中了,这是绝对不允许的。经过本人的N次调试,发现public View getView(int position, View convertView, ViewGroup parent)传进来的convertView竟然产生多次重用。解决方案:当选中checkedBox时候,我们用一个List来保存该checkBox的position。然后在每次产生View时取得传来的convertView赋值为null,再遍历List里保存的checkBox的位置,当在数组内时,checkBox置为选中,问题解决了。

该问题有解决方案,个人目前所实现了的。

1.用HashMap保存checkbox的状态值。

HashMap state = new HashMap();

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
	// TODO Auto-generated method stub
	if(isChecked)
	{  
		   state.put(position, isChecked);
			System.out.println("复选框以选中,选中的行数为:" + temp_position);
	}else{
		 state.remove(position);
	}
}

在getView()方法里面:

holder.cbox.setChecked(state.get(position)==null? false : true);

 

2.用List保存checkbox位置

private static List selected = new ArrayList();

cbSelect.setOnClickListener(new OnClickListener() {
	@Override
	public void onClick(View arg0) {
		if (cbSelect.isChecked()) {
			selected.add(String.valueOf(fid));			
		} else if (!cbSelect.isChecked()) {
			selected.remove(String.valueOf(position));			
		}
	}
});

在getView()方法里面:

cbSelect.setChecked((selected.contains(String.valueOf(position))));

3.(不推荐使用,因为会产生许多垃圾对象)

public View getView(int position, View convertView, ViewGroup parent)在每次传进convertView时候,设为null。

然后每调用一次getView就产生一个view对象。

多级树形列表:

更快实现Android多级树形选择列表

快速实现Android多级树形列表,这个库是在鸿洋多级树形列表demo中修改而来。

解决的问题:

  1. 支持ID为int类型和String类型。

  2. 支持多级复选框选中,使用只需一行代码。

  3. 支持动态更新数据并保持原有展开/关闭状态。

  4. 支持ListView、RecyclerView。

项目地址:https://github.com/zhangke3016/MultilevelTreeList

 

转载于:https://my.oschina.net/u/2320057/blog/395635

你可能感兴趣的:(Android ListView Adapter中checkbox 勾选位置错乱)