Listview中巢狀Checkbox的簡單解決辦法
最近專案中做了一個關於批量刪除的這樣一個操作,以前是會做的,誰知道記性不好忘光了,經過一番折騰還是完美的實現了,相信後面還有無數個和我一樣的渣渣會遇到這個問題,那麼就讓我來分享一下咯。
當然這個checkbox控制元件是寫在item佈局中的。我這邊的需求是點選編輯按鈕才會顯示checkbox,點選取消隱藏。所以開始還是隱藏吧。
<CheckBox
android:id="@+id/cb_test_change"
android:layout_width="30dp"
android:layout_height="match_parent"
android:layout_marginLeft="15dp"
android:button="@drawable/selector_check"
android:gravity="center"
android:visibility="gone" />
其次重要的就是在adapter當中了。這裡我用了Set集合,好多人都使用的是HashMap<Integer,Boolbean>,然後初始化HashMap都為false,這個方法是可行的,記錄位置與對應位置點選的狀態。但是使用Set本人認為更加的簡單,這裡只需要記錄被點選了的checkbox的位置即可。使用最好使用靜態的Set這樣可以在Activity中使用物件得到Set集合。
// 用來控制CheckBox的選中狀況
private static Set<Integer> selectSet;
下面這一段程式碼是在getview()中新增的,可以根據具體需求去相應的新增。
checkBox_edit.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
selectSet.add(position);
}
if (!isChecked) {
if (selectSet.contains(position)) {//這個比較重要,如果點選選中這個位置就會存在Set集合當中,當再次點選它就取消了,所以也要從集合中移除。
selectSet.remove(position);
}
}
}
});
在我解決這個問題的時候還衍生了很多其他的問題,但是需求沒有,所以也就沒去弄。這裡既然是寫部落格,那麼就一起總結一下吧。
關於全選,全部取消和反轉選擇,這裡大家就要使用HashMap集合啦。
在adapter當中初始化一個靜態的HashMap<Integer,Boolbean>集合,為它新增set,get方法,並且根據集合的大小為它新增資料,預設false。在getview()方法中做一下操作。
1.設定checkbox點選狀態根據position得到集合中對應的值。
2.新增點選事件,將點選狀態存入集合當中,
當然實現上述三種功能就是對HashMap集合內資料的操作;
1.全選,設集合值都為true。
2.取消,設定集合內的值都為false。
3.反轉就是遍歷集合將true設定為false,false設定為true即可。
當然還有人會遇到當添加了checkbox之後listview點選不了的問題,這裡自己也是出於學習,大概的說一下吧,事件分發會在下一節詳細說明,大神請指正。關於這個問題就和android的事件分發機制就有關係了。
Android為什麼要有事件分發呢?因為它是按照層排列,他如何知道你點選的哪一層呢,就需要用到事件分發了.
說到事件分發可能就會想起那三個威武的方法:事件分發(dispatchTouchEvent(MotionEvent ev))、事件攔截(onInterceptTouchEvent(MotionEvent ev))、事件響應(onTouchEvent(MotionEvent ev)),其中ViewGroup響應這三個方法。這裡由於checkbox消費了這個點選事件,也就是事件響應返回值為true。所以將它包裹的listview就無法去響應點選事件了,因為點選已經被checkbox消費了。這裡如果想要點選listview就去選中checkbox,方法也很簡單,如下:
1,設定 checkbox無法響應點選事件
- android:clickable="false"
- android:focusable="false"
- android:focusableInTouchMode="false"
2.根據item的點選情況,給checkbox賦值
- mListView.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view,
- int position, long id) {
- ViewHolder holder = (ViewHolder) view.getTag();
- holder.mCheckBox.toggle(); //得到checkbox逆其狀態設定。
- MyShowAdapter.getIsSelected().put(position, holder.mCheckBox.isChecked());
- }
- });
ok,好像就這麼多了,如果大家還有其他關於這方面的問題可以歡迎留言,一起探討。