2013-10-10 67 views
5

朋友,單選Android的ExpandableListView在ChildView的CheckBox

我想寫一個ExpandableListView在ChildView中使用單選複選框。 我無法理解如何在ExpandableListView的OnChildClickListener()中將其他CheckBox設置爲「false」。這裏是我的代碼:

ExpListView.setOnChildClickListener(new OnChildClickListener() { 

      @Override 
      public boolean onChildClick(ExpandableListView parent, View v, 
        int groupPosition, int childPosition, long id) { 
       CheckBox cb = (CheckBox) v.findViewById(R.id.checkbox); 
       if (cb.isChecked()) {   

       } else { 
        cb.setChecked(true); 
        //Here somehow I must set all other checkboxes to false. 
          //Is it possible? 
       } 
       return false; 
      } 
    }); 

這裏是ChildView的XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="horizontal"> 

    <TextView 
    android:id="@+id/textChild" 
    android:layout_width="wrap_content" 
    android:layout_height="40dp" 
    android:layout_marginLeft="20dp" 
    android:layout_marginTop="20dp" 
    android:textColor="@android:color/white" 
    android:layout_weight="1" 
    /> 

<CheckBox android:id="@+id/checkbox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:focusable="false" 
     android:clickable="false" 
     android:layout_gravity="right" 
     android:visibility="visible" 
/> 

</LinearLayout> 
+0

你可以遞歸地遍歷ExpandableListView的所有子元素並找到另一個複選框。或者更好地首先查找(如果你不知道它的id)父節點並選中它的複選框。或者甚至更好 - 將你的複選框放在數組中,改變它的檢查狀態並調用notifyDataSetChanged()方法。 –

+0

請你解釋我的第二個建議。這是我想要做的,但我是Android新手,我無法理解如何在選定部分尋找其他複選框 – Dlash

+0

您能否提供更多與您的ExpListView初始化和加載相關的代碼? –

回答

5

如果你想只能夠選擇一個複選框,您可以將選中的複選框存儲在一個變量CheckBox checkedBox;。當單擊CheckBox,你可以沿着

@Override 
     public boolean onChildClick(ExpandableListView parent, View v, 
       int groupPosition, int childPosition, long id) { 
      CheckBox last = checkedBox //Defined as a field in the adapter/fragment 
      CheckBox current = (CheckBox) v.findViewById(R.id.checkbox); 

      last.setCheked(false); //Unchecks previous, checks current 
      current.setChecked(true); // and swaps the variable, making 
      checkedBox = current;  // the recently clicked `checkedBox` 

      return false; 
     } 

雖然線做一些事情,我不知道這是否會工作,機器人會查看回收系統,但它是值得一試。

如果您需要多種選擇,您可以將checkedBox擴展爲List<CheckBox>,並在每次需要取消選中框時對其進行迭代。

如果您需要存儲一些額外的數據(您最有可能需要),您可以創建一個持有者類,例如,

class CheckBoxHolder{ 

    private CheckBox checkBox: 
    private int id; 

    public CheckBoxHolder(CheckBox cb, int id){ 
     this.checkBox = cb; 
     this.id = id; 
    } 
    // Getter and/or setter, etc. 
} 
相關問題