2015-06-25 8 views
16

sto usando un GridView all'interno di un ExpandableListViewCercando di deselezionare una vista utilizzando getChildAt()

Ho una funzione che mette in evidenza un elemento quando si fa clic, ora sto cercando di implementare un pulsante che se premuto sarà deselezionare tutti gli elementi selezionati, ma è Deselezionando solo l'ultima vista fatto clic

public class GridAdapter extends BaseAdapter { 

    private Context mContext; 
    private ArrayList<Filhos> child; 
    public ArrayList<CadastraEscolas> escola; 
    private ArrayList<ArrayList<Filhos>> filhos = new ArrayList(); 



    public GridAdapter(Context context, ArrayList<CadastraEscolas> groups, ArrayList<Filhos> childValues, int groupPosition) { 
     mContext = context; 
     child = childValues; 
     escola = groups; 
     posicaoEscola = groupPosition; 


    } 


    @Override 
    public int getCount() { 
     return child.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    @Override 
    public long getItemId(int arg0) { 
     return 0; 
    } 

    @Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 


     holder = null; 



     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) mContext 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.child_item, null); 
      holder = new ViewHolder(); 


      final TextView idAluno = (TextView) convertView.findViewById(R.id.idcrianca); 
      final TextView nomeAluno = (TextView) convertView.findViewById(R.id.name); 



      convertView.setTag(holder); 

      final View finalConvertView = convertView; 
      convertView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 





        if (list.size() > 0) { 

         isChecked = filhos.get(posicaoEscola).get(position).isChecked(); 


         if (!isChecked) { 

          selecao(true, position, nomeAluno, 0xFFFFFFFF, finalConvertView, View.VISIBLE); 


         } else { 

          selecao(false, position, nomeAluno, 0xFFD5672B, finalConvertView, View.GONE); 

         } 



        ex.findViewById(R.id.notificar).setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(final View v) { 


          limpaSelecao(false, position, nomeAluno, 0xFFD5672B, parent, View.GONE); 



         } 
        }); 


       } 
      }); 


     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.text.setText(child.get(position).getNome()); 


     return convertView; 


    } 


    static class ViewHolder { 
     TextView text; 
    } 



    public void selecao(boolean check, int position, TextView nomeAluno, int color, View v, int visibility) { 
    filhos.get(posicaoEscola).get(position).setChecked(check); 
    nomeAluno.setTextColor(color); 
    v.findViewById(R.id.overlay).setVisibility(visibility); 
    v.findViewById(R.id.overlayText).setVisibility(visibility); 
} 

public void limpaSelecao(boolean check, int position, TextView nomeAluno, int color, ViewGroup v, int visibility) { 



    for (int x = 0; x < group.size(); x++) { 

     for (int j = 0; j < group.get(x).getalunos().size(); j++) { 


      if(filhos.get(x).get(j).isChecked()){ 
       v.getChildAt(j).findViewById(R.id.loadingPanel).findViewById(R.id.overlay).setVisibility(View.GONE); 
      } 



      nomeAluno.setTextColor(color); 
     } 
    } 


} 

} 

Disposizione:

<RelativeLayout 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:background="@drawable/nomealuno_main" 
       android:layout_below="@+id/child"> 

       <View 
        android:id="@+id/overlay" 
        android:layout_width="125dp" 
        android:layout_height="50dp" 
        android:background="@color/bgOverlay" 
        android:visibility="gone"/> 
</RelativeLayout> 

qui è che cosa è succedendo g:

quando seleziono tutti gli elementi da A a B in quel modo:

enter image description here

e ha colpito chiaro, rimuoverà solo i bambini selezionati tra l'ultimo gruppo che ho cliccato:

enter image description here

Devo rimuoverli tutti quando faccio clic su Cancella, tutti i bambini non importa in quale gruppo devono essere rimossi.

ExpandableAdapter:

public class ExpandListTest extends BaseExpandableListAdapter { 


    public static final int CHOICE_MODE_MULTIPLE = AbsListView.CHOICE_MODE_MULTIPLE; 


    public static final int CHOICE_MODE_MULTIPLE_MODAL = AbsListView.CHOICE_MODE_MULTIPLE_MODAL; 

    /** 
    * No child could be selected 
    */ 
    public static final int CHOICE_MODE_NONE = AbsListView.CHOICE_MODE_NONE; 

    /** 
    * One single choice per group 
    */ 
    public static final int CHOICE_MODE_SINGLE_PER_GROUP = AbsListView.CHOICE_MODE_SINGLE; 

    /** 
    * One single choice for all the groups 
    */ 
    public static final int CHOICE_MODE_SINGLE_ABSOLUTE = 10001; 

    private Context context; 
    public static ArrayList<CadastraEscolas> groups; 
    private ArrayList<ArrayList<Filhos>> child = new ArrayList(); 
    private HashMap<String, GPSEscolas> aMap = new HashMap<String, GPSEscolas>(); 
    private HashMap<String, GPSEscolas> HashTask = new HashMap<String, GPSEscolas>(); 
    public static ArrayList<Filhos> listchild; 
    private GridAdapter adapter; 
    private SecurePreferences Sessao; 
    public static CustomGridView gridView; 
    private SparseArray<SparseBooleanArray> checkedPositions; 
    private static final String LOG_TAG = ExpandListAdapter.class.getSimpleName(); 


    public ExpandListTest(Context context, ArrayList<CadastraEscolas> groups, HashMap<String, GPSEscolas> data, SecurePreferences mSessao, HashMap<String, GPSEscolas> hashTask) { 
     this.context = context; 
     this.groups = groups; 
     this.aMap = data; 
     this.Sessao = mSessao; 
     checkedPositions = new SparseArray<SparseBooleanArray>(); 
     child = new ArrayList(); 
     if (groups != null) { 
      for (int i = 0; i < groups.size(); i++) { 
       child.add(i, groups.get(i).getalunos()); 
      } 
     } 
    } 


    @Override 
    public Object getChild(int groupPosition, int childPosition) { 
     return child.get(childPosition); 
    } 

    @Override 
    public long getChildId(int groupPosition, int childPosition) { 
     return childPosition; 
    } 

    @Override 
    public View getChildView(final int groupPosition, final int childPosition, 
          boolean isLastChild, View convertView, final ViewGroup parent) { 


     if (convertView == null) { 
      LayoutInflater infalInflater = (LayoutInflater) context 
        .getSystemService(context.LAYOUT_INFLATER_SERVICE); 
      convertView = infalInflater.inflate(R.layout.gridview, null); 
     } 


     listchild = new ArrayList<Filhos>(); 

     for (int j = 0; j < groups.get(groupPosition).getalunos().size(); j++) { 

      listchild.add(child.get(groupPosition).get(j)); 

     } 


     gridView = (CustomGridView) convertView.findViewById(R.id.GridView_toolbar); 

     gridView.setExpanded(true); 
     adapter = new GridAdapter(context, groups, listchild, child, groupPosition, aMap, HashTask, Sessao); 
     gridView.setAdapter(adapter);// Adapter 
     gridView.setChoiceMode(CustomGridView.CHOICE_MODE_MULTIPLE); 



     return convertView; 

    } 


    @Override 
    public int getChildrenCount(int nGroup) { 
     return 1; 

    } 


    @Override 
    public Object getGroup(int groupPosition) { 
     return groups.get(groupPosition); 
    } 

    @Override 
    public int getGroupCount() { 
     return groups.size(); 
    } 

    @Override 
    public long getGroupId(int groupPosition) { 
     return groupPosition; 
    } 

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
          View convertView, ViewGroup parent) { 
     CadastraEscolas group = (CadastraEscolas) getGroup(groupPosition); 
     if (convertView == null) { 
      LayoutInflater inf = (LayoutInflater) context 
        .getSystemService(context.LAYOUT_INFLATER_SERVICE); 
      convertView = inf.inflate(R.layout.group_item, null); 
     } 
     ExpandableListView mExpandableListView = (ExpandableListView) parent; 
     mExpandableListView.expandGroup(groupPosition); 
     TextView tv = (TextView) convertView.findViewById(R.id.group_name); 
     tv.setText(group.getNome_fantasia()); 

     return convertView; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     return true; 
    } 

} 
+0

leggi documenti ViewGroup – pskink

+0

@pskink va bene ho letto, ora potresti aiutarmi? – AND4011002849

+0

si desidera rimuovere una vista dal genitore o cosa? – Karoly

risposta

6

ViewGroups Android possono contenere qualsiasi numero di Visualizzazioni, ma viste possono avere un solo genitore ViewGroup, se si tenta di aggiungere una vista che ha già un genitore, si otterrà questa eccezione (da ViewGroup.addViewInner()):

throw new IllegalStateException("The specified child already has a parent. " + 
       "You must call removeView() on the child's parent first."); 

Ciò significa che la struttura dei vostri layout è quella di un albero (non un grafico), e così è possibile utilizzare qualsiasi algoritmo di attraversamento di alberi per scorrere ogni vista della vostra disposizione.

Quello che segue è uno dei possibili algoritmi, che è un traversal post-ordine.

enter image description here

Essa passa attraverso l'elemento principale, prende il primo figlio e fa una chiamata ricorsiva per l'algoritmo, allora è il secondo, terzo, ecc ... quando non ci sono bambini lasciati passare attraverso, si chiama la tua funzione deseleziona per il nodo.

Per l'albero nel diagramma, i nodi saranno non selezionati in questo ordine:

A, C, E, D, B, H, I, G, F

public void onClickTheButton(View view) { 
    unselectall(R.layout.your_layout); 
} 

public void unselectAll(View view) { 
    if(view instanceof ViewGroup) { 
     for(int ii = 0 ; ii<(ViewGroup)view.getChildrenCount(); ii++) { 
      unselectAll((ViewGroup)view.getChildAt(ii)); 
     } 
    } 
    unselect(view); 
} 

Potete trovare molti altri modi per farlo qui: https://en.wikipedia.org/wiki/Tree_traversal

È necessario imparare come funzionano quegli algoritmi se si desidera semplificare la propria esperienza di programmazione.

+0

Ho modificato la domanda, dal momento che ho un ExpandableListView con 2 gruppi all'interno, quindi ho 2 ViewGroups, come posso ottenere tutti i bambini subito? – AND4011002849

+0

spiegami come funziona, quindi posso accettare la tua risposta come quella giusta – AND4011002849

+0

Va bene così? –

1

cambiare il metodo getView() come segue.

@Override 
public View getView(final int position, View convertView, final ViewGroup parent) { 
    holder = null; 

    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.child_item, null); 
     holder = new ViewHolder(); 

     final TextView idAluno = (TextView) convertView.findViewById(R.id.idcrianca); 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.text.setText(child.get(position).getNome()); 

    final View finalConvertView = convertView; 
    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      if (list.size() > 0) { 
       isChecked = filhos.get(posicaoEscola).get(position).isChecked(); 

       if (!isChecked) { 
        selecao(true, position, nomeAluno, 0xFFFFFFFF, finalConvertView, View.VISIBLE); 
       } else { 
        selecao(false, position, nomeAluno, 0xFFD5672B, finalConvertView, View.GONE); 
       } 

       ex.findViewById(R.id.notificar).setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(final View v) { 

         limpaSelecao(false, position, nomeAluno, 0xFFD5672B, parent, View.GONE); 
        } 
       }); 
      } 
     }); 

     return convertView; 
    } 
+0

controlla questo e fammi sapere che funziona o no? –

+0

No, ottenendo gli stessi risultati, solo l'ultimo gruppo cliccato sta deselezionando – AND4011002849

+0

Sei sicuro di passare un riferimento alla vista che contiene entrambe le sezioni? E 'sempre la stessa che viene selezionata non selezionata, o è quella che contiene l'allievo che stai facendo clic? –

Problemi correlati