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

相關文章
相關標籤/搜索