ListView加載CheckBox,在進行全選操作時,或全選狀態下,勾選ListView中Item的CheckBox時,全選狀態沒有改變之類的情況。
ListView中itemCheckBox與全選AllCheckBox存在以下關聯:
(1)AllCheckBox選中狀態與未選中狀態下,itemCheckBox隨之變化;
(2)itemCheckBox未選中時,應AllCheckBox為未選中狀態;
(3)itemCheckBox選中時,需判斷ListView中所有的checkbox是否處於選中狀態,若為選中狀態,則將AllCheckBox狀態改為選中,否則為未選中狀態。
解決思路:
(1)在Adapter存下每個checkBox的狀態;
(2)通過AllCheckBox狀態改變itemCheckBox狀態;
(3)通過判斷Adapter中所有checkbox的選中狀態,去更新AllCheckBox狀態;
(4)使用Handler更新AllCheckBox狀態。
實現代碼:
1)定義ListView的item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/background_color"
android:orientation="horizontal"
android:paddingBottom="10dip"
android:paddingTop="10dip" >
<TextView
android:id="@+id/tv_time"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:gravity="center"
android:text="時間"
android:textColor="@color/black"
android:textSize="15sp" />
<TextView
android:id="@+id/tv_place"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.5"
android:gravity="center"
android:text="地點"
android:textColor="@color/black"
android:textSize="15sp" />
<TextView
android:id="@+id/tv_money"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:gravity="center"
android:text="金額"
android:textColor="@color/black"
android:textSize="15sp" />
<CheckBox
android:id="@+id/cb_select"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center|center_vertical"
android:layout_weight="0.5"
android:button="@drawable/cb_item_selected"
android:focusable="false"
android:focusableInTouchMode="false" />
</LinearLayout>
2)定義ListView的Adapter,以下為一些關鍵的源代碼
2.1)定義變量
private HashMap<Integer, Boolean> isSelected = null;//存儲checkbox狀態
private Handler statusHandler = null;//更新AllCheckBox的handler
private class ViewHolder {TextView tvTime, tvPlace, tvMoney;CheckBox cbSelect;}
2.2)定義判斷全選狀態的方法
private boolean isAllSelected() {
for (int i = 0; i < isSelected.size(); i++) {
if (!isSelected.get(i)) {
return false;
}
}
return true;
}
2.3)定義選擇checkBox方法
public void select(int potision, boolean isChecked) {
isSelected.put(potision, isChecked);//記錄下當前checkBox的狀態
Message msg = statusHandler.obtainMessage();
if (isChecked) {
if (isAllSelected()) {
msg.what = MainActivity.ALL_SELECTED_CHECK;//將AllCheckbox狀態改為選中
} else {
msg.what = MainActivity.NOT_ALL_SELECTED_CHECK;//將AllCheckBox改成未選中
}
} else {
msg.what = MainActivity.NOT_ALL_SELECTED_CHECK;//將AllCheckBox改成未選中
}
statusHandler.sendMessage(msg);
}