5

Ho implementato un recyclerview espandibile con elementi figlio che fanno parte dell'elenco. Ho seguito questo code. Funziona così,Modifica gestori layout per viste diverse in RecyclerView

L'implementazione di ExpandableListView utilizzando RecyclerView viene brevemente descritta come segue. Il modello di elenco ha un ulteriore parametro "tipo" che identifica se l'elemento è un'intestazione o un figlio. Controllando questo parametro, l'adattatore gonfia vista e viewholder corrispondenti al tipo. Se il tipo è HEADER, gonfierà il layout dell'elemento di intestazione, che contiene un TextView e un ImageView per indicare se l'albero figlio è espanso o meno.

Ora, ciò che voglio fare è rendere il layout espanso una griglia. Normalmente lo farei impostando il gestore di layout su GridLayoutManager ma in questo caso, sto usando solo un recyclerview, il che significa che non posso cambiare il gestore di layout senza modificare l'intestazione che finisce per trasformare l'intero recyclerview in un griglia includendo le intestazioni.

La mia domanda è: come cambiereste il layout manager solo per un paio di layout all'interno dell'adattatore?

Modifica: ho aggiunto del codice.

adattatore Recyclerview:

public class ExpandableListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

// These are constants that are used to determine if the item is a child or a header and is defined with each item from the data model 
public static final int HEADER = 0; 
public static final int CHILD = 1; 

private List<Item> data; 

public ExpandableListAdapter(List<Item> data) { 
    this.data = data; 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int type) { 
    View view = null; 

    LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    // Check whether the item is a header or child and inflate differnet layouts 
    switch (type) { 
     case HEADER: 
      // Inflate a header layout if the item is a header 
      view = inflater.inflate(R.layout.list_header, parent, false); 
      ListHeaderViewHolder header = new ListHeaderViewHolder(view); 
      return header; 
     case CHILD: 
      // Inflate a child layout if the item is a child 
      view = inflater.inflate(R.layout.list_child, parent, false); 
      ListChildViewHolder child = new ListChildViewHolder(view); 
      return child; 
    } 
    return null; 
} 

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    final Item item = data.get(position); 

    // Bind different layouts based on if the item is a header or child 
    switch (item.getType()) { 
     case HEADER: 
      // ... 
     case CHILD: 
      // ... 
    } 
} 

@Override 
public int getItemViewType(int position) { 
    return data.get(position).type; 
} 

@Override 
public int getItemCount() { 
    return data.size(); 
} 

// Viewholder for the header items 
private static class ListHeaderViewHolder extends RecyclerView.ViewHolder { 
    // ... 
} 

// Viewholder for the child items 
private static class ListChildViewHolder extends RecyclerView.ViewHolder { 
    // ... 
} 

E questa è l'attività principale dove dichiaro il gestore di layout:

recyclerview = (RecyclerView) findViewById(R.id.recyclerview); 
recyclerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); 

risposta

9

È possibile cambiare il gestore di layout per GridLayoutManager e definire la "dimensione span" per l'intestazione, ad esempio, se si desidera la griglia con 2 colonne, l'intestazione deve avere la dimensione di span 2 e la dimensione dei bambini 1:

C'è un esempio completo di griglia espandibile con intestazioni here utilizzando questo library.

+0

Va bene, farò dare un'occhiata a questi esempi. – spectre10

+0

Ok, come potrei implementare un adattatore selezionabile con la tua libreria? Ho creato una classe astratta che estende RecyclerView.Adapter e sto usando il mio adattatore regolare per estendere questa classe astratta. – spectre10

+0

Ciao, potresti per favore creare una nuova domanda in modo da poter fornire maggiori dettagli su ciò che hai fatto finora? Puoi spiegare meglio cosa intendi con adattatore 'selezionabile'? È solo per evidenziare un elemento cliccato? – Gustavo

0

cambiamento il gestore di layout per GridLayout manager e gestire le dimensioni arco come indicato di seguito

layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
      @Override 
      public int getSpanSize(int position) { 
       int type=mAdapter.getItemViewType(position); 
       if (type == "view holder type name") 
        return 2; 
       else 
        return 1; 
      } 
     }); 
Problemi correlati