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));
Va bene, farò dare un'occhiata a questi esempi. – spectre10
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
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