Autore Topic: Expandable List View e checkbox in group  (Letto 280 volte)

Offline aioria

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
Expandable List View e checkbox in group
« il: 18 Maggio 2016, 16:53:24 CEST »
0
Salve ho un problema riguardo all'uso di una expandableListView.
Sto usando un fragment in cui ho inserito una checkbox e una expandableListView ed in ogni intestazione dei gruppi della lista c'è una checkbox.

Quando seleziono la checkbox esterna vorrei attivare tutte quelle dei gruppi (un po come in gmail con il "seleziona tutte le email").

All'interno dell'adapter ho creato un array di booleani che si riferisce allo stato di ogni checkbox, questo lo uso nel metodo getGroupView() cosi da avere il corretto stato della checkbox anche quando scrollo la lista.

Codice (Java): [Seleziona]
public class GroupExpandableListAdapter extends BaseExpandableListAdapter {
 boolean[] checkBoxState;
 private List<Group> mGroupList;

public GroupExpandableListAdapter(Context context, int layoutParent, int layoutChild, List<Group> items) {
    mGroupList = list;
    checkBoxState = new boolean[list.size()];
}

@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    ViewHolderGroup holderGroup;
        if (convertView == null) {
               ....
               holderGroup.mcheckBox = (CheckBox) convertView.findViewById(R.id.check_show);
        }
        else
              holderGroup = (ViewHolderGroup) convertView.getTag();
             
              holderGroup.barrierCheckBox.setChecked(checkBoxState[groupPosition]);

              holderGroup.barrierCheckBox.setOnClickListener(new View.OnClickListener() {
               @Override
                public void onClick(View v) {
                   ViewGroup parent = (ViewGroup) v.getParent();
                   if (((CheckBox) v).isChecked()) {
                      checkBoxState[groupPosition] = true;
                   } else {
                      checkBoxState[groupPosition] = false;
                }
            }
        });
       
        return convertView;
}

public void clickAll(boolean state) {
        for (int i = 0; i < mGroupList.size(); i++) {
            checkBoxState[i] = state;
        }
    }

}
Quando clicco sulla checkbox esterna, tramite il metodo definito nell'adapter ( clicKAll() )vado a settare questo array tutto a true o tutto a false. La view in questo modo non viene aggiornata, ma lo è se scrollo la pagina (scrollando tutte le checkbox sono attivate o disattivate).

se riuscissi ad aggiornare la view dei gruppi avrei risolto il problema ma non vi riesco.

Mi chiedevo quindi come raggiungere l'obiettivo anche in maniera diversa se necessario.
Grazie.
« Ultima modifica: 19 Maggio 2016, 12:02:14 CEST da aioria »

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Expandable List View e checkbox in group
« Risposta #1 il: 18 Maggio 2016, 21:10:43 CEST »
0
Io ho fatto una roba perfetta a lavoro. Domani la metto qui.

Post unito: 18 Maggio 2016, 21:16:33 CEST
Innanzitutto lavoro con lista di liste. Quindi una lista di oggetti Group. E ogni group ha una lista di Child inizializzata a vuota. Sia Group che child hanno un booleano inizializzato a false. Quando in getView usi il listener per il checkbox parentesi setti tutti i figli a true ovviamente. Poi chiami il notify.
« Ultima modifica: 18 Maggio 2016, 21:16:33 CEST da tonno16, Reason: Merged DoublePost »

Offline aioria

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
Re:Expandable List View e checkbox in group
« Risposta #2 il: 19 Maggio 2016, 16:29:01 CEST »
0
ho risolto al momento il problema in questo modo:
Quando clicco sulla checkbox esterna si attiva il metodo onCheckChangeListener() (avendo settato nel metodo onCreate() questo listener per la checkbox). Al suo interno eseguo il seguente codice


Codice (Java): [Seleziona]
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    // when screen rotate, activity call this method so be sure that user call it and not system
    if (buttonView.getId() == R.id.check_show_all && buttonView.isPressed()) {
        ExpandableListView expandableListView = (ExpandableListView) getActivity().findViewById(R.id.expandable_group_list);

        // get the (flat) number of visible views
        int lastVisPos = expandableListView.getLastVisiblePosition();
        for(int i = 0; i <= lastVisPos; i++){
            View v = expandableListView.getChildAt(i);
            long packedPosition = expandableListView.getExpandableListPosition(i);
            long packedType = ExpandableListView.getPackedPositionType(packedPosition);
            if(packedType == ExpandableListView.PACKED_POSITION_TYPE_GROUP){
                CheckBox checkBox = (CheckBox)v.findViewById(R.id.check_show);
                checkBox.setChecked(isChecked);
            }
        }

        // change checkbox state
        MyGroupExpandableListAdapter adapter = (MyGroupExpandableListAdapter) expandableListView.getExpandableListAdapter();
        adapter.clickAll(isChecked);

      }
}


Nel codice prendo il numero di oggetti visibili, estrapolo il tipo di oggetto (gruppo o figlio), e se è un gruppo prendo il riferimento alla checkbox e ne aggiorno lo stato.


Aggiorno poi lo stato a tutte le checkbox degli altri gruppi tramite il metodo pubblico clickAll (vedi primo post) inserito nell adapter. In questo modo quando scrollo la lista sono settati tutti i restanti checkbox.


Probabilmente è un workaround nemmeno ben fatto, ma al momento funziona e mi consente di andare avanti.
Se qualcuno ha suggerimenti migliori è ben accetto.