2013-10-10 10 views
5

Amici,ExpandableListView Android con un'unica CheckBox scelta a ChildView

Sto cercando di scrivere un ExpandableListView che utilizzano caselle di scelta singoli a ChildView. E non riesco a capire come impostare altri CheckBox su "false" in OnChildClickListener() di ExpandableListView. Qui è il mio codice:

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; 
      } 
    }); 

qui è XML di ChildView:

<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

È possibile passare in modo ricorsivo attraverso tutti i child di ExpandableListView e trovare altre caselle di controllo. o ancora meglio trovare prima (se non si conosce il suo id) visualizzazione genitore per la sezione selezionata e ottenere le sue caselle di controllo. O ancora meglio: tieni le tue checkbox in array, cambia il suo stato controllato e chiama il metodo notifyDataSetChanged(). –

+0

Mi puoi spiegare il tuo secondo suggerimento, per favore. Questo è quello che voglio fare, ma sono nuovo su Android e non riesco a capire come cercare altre checkbox nella sezione selezionata – Dlash

+0

, puoi fornire più codice relativo all'inizializzazione e al caricamento di ExpListView? –

risposta

5

Se si vuole solo essere in grado di selezionare una casella di controllo, è possibile memorizzare la casella di controllo controllato in una variabile CheckBox checkedBox;. Quando un CheckBox viene cliccato, si potrebbe fare qualcosa sulla falsariga di

@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; 
     } 

Anche se, non sono sicuro se questo funzionerà con androidi vista di sistema di riciclo, ma vale la pena un colpo.

Se sono necessarie più opzioni, è possibile espandere checkedBox in un List<CheckBox> e iterare su di esso ogni volta che è necessario deselezionare le caselle.

Se è necessario memorizzare alcuni dati aggiuntivi (che è probabilmente necessario), è possibile creare una classe titolare, ad es.

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. 
}