Android ListView Adapter中checkbox 勾选位置错乱

假如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置为选中,问题解决了。html

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

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

HashMap<Integer, Boolean> state = new HashMap<Integer,Boolean>();

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()方法里面:git

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

 

2.用List<String>保存checkbox位置

private static List<String> selected = new ArrayList<String>();

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()方法里面:github

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

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

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

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

多级树形列表:

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

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

解决的问题:code

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

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

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

  4. 支持ListView、RecyclerView。

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

相关文章
相关标签/搜索