11

Quello che mi piacerebbe fareRecyclerView con diversi Cardlayouts


Al momento sto giocando intorno con RecyclerView e CardView 's. Per ora ho scritto un RecyclerView.Adapter su cui posso visualizzare lo stesso CardView più volte con contenuti diversi - analogico allo ListView con uno BaseAdapter.

Ora mi piacerebbe scrivere un RecyclerView con diversi CardView-Layout (in stile Google Now). Ho già cercato tutorial ma non ho trovato nulla di utile su quell'argomento. Qualcuno sa, come deve essere implementato? Cosa bisogna fare per rendersene conto?

+0

https://developer.android.com/training/material/lists-cards.html. E per i diversi layout basta cambiare il ViewType sul tuo adattatore –

+0

@PedroOliveira Ho già letto che, ma mostra solo come è fatto con una carta, e non diversi. – safari

+0

Devi sovrascrivere 'getItemViewType' sull'adattatore e restituire un diverso tipo di vista in modo da poter gonfiare layout diversi sul tuo' onCreateViewHolder' (che riceve il tipo di vista come parametro 2º) –

risposta

16

Per ottenere ciò che desideri, è necessario eseguire l'override di getItemViewType(position) su RecyclerView.Adapter, dove viene restituito un int che indica quale tipo di visualizzazione verrà utilizzato per rappresentare questa posizione.

In seguito creerai diversi ViewHolders su createViewHolder (parent,viewType) che manterranno i riferimenti a ciascun CardLayout distinto nel tuo caso.

Quindi su bindViewHolder(holder, position) è possibile creare un'istruzione switch o in caso contrario passare attraverso l'elenco di possibili visualizzazioni e riempirle di dati.

codice di esempio riportato di seguito:

public GeneralViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 

    GeneralViewHolder holder; 
    View v; 
    Context context = viewGroup.getContext(); 

    if (viewType == FIRST_TYPE) { 
     v = LayoutInflater.from(context) 
       .inflate(R.layout.first_card, viewGroup, false); 

     holder = new FirstTypeViewHolder(v); //Of type GeneralViewHolder 
    } else { 
     v = LayoutInflater.from(context) 
       .inflate(R.layout.second_card, viewGroup, false); 
     holder = new SecondTypeViewHolder(v); 
    } 

    return holder; 
} 

public void onBindViewHolder(GeneralViewHolder viewHolder, int i) { 
    if(getItemViewType(i)==FIRST_TYPE) { 
     FirstTypeViewHolder holder1 = (FirstTypeViewHolder)viewHolder; 
    } else { 
     SecondTypeViewHolder holder1 = (SecondTypeViewHolder)viewHolder; 
    } 
} 

public int getItemViewType (int position) { 
    //Some logic to know which type will come next; 
    return Math.random()<0.5 ? FIRST_TYPE : SECOND_TYPE; 
} 
+0

questo è fantastico, grazie ci proverò. :-)! +1 – safari

Problemi correlati