1. 程式人生 > >Listview中巢狀Checkbox的簡單解決辦法

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無法響應點選事件

  1. android:clickable="false"  
  2.         android:focusable="false"  
  3.         android:focusableInTouchMode="false"   

2.根據item的點選情況,給checkbox賦值

  1. mListView.setOnItemClickListener(new OnItemClickListener() {  
  2.             @Override  
  3.             public void onItemClick(AdapterView<?> parent, View view,  
  4.                     int position, long id) {  
  5.                 ViewHolder holder = (ViewHolder) view.getTag();   
  6.                 holder.mCheckBox.toggle();  //得到checkbox逆其狀態設定。
  7.                 MyShowAdapter.getIsSelected().put(position, holder.mCheckBox.isChecked());  
  8.             }  
  9.         });  

ok,好像就這麼多了,如果大家還有其他關於這方面的問題可以歡迎留言,一起探討。