2015-12-24 13 views
14

Devo aggiungere una piccola striscia tra gli elementi di un RecyclerView. Questa striscia può venire dopo un numero diverso di elementi in una lista. Questo deve essere fatto dinamicamente. Ho bisogno di implementare qualcosa di simile a quello che ha fatto FitBit: enter image description hereCome aggiungere una vista dinamica tra gli elementi di RecyclerView in Android?

Ho anche bisogno della prima riga, cioè quella che dice "Questa settimana" in cima anche se la pagina scorre verso il basso.

+3

È necessario utilizzare due tipi di vista. Vedi [questa domanda] (http: // StackOverflow.it/questions/26245139/how-to-create-recyclerview-with-multiple-view-type) per vedere come implementarlo. Potrebbe essere un indizio per ottenere quello che vuoi. – Fllo

+0

Sì, l'ho usato solo al momento. Ma un problema persiste ancora: in che modo FitBit riesce a mantenere la riga di intestazione sulla parte superiore dello schermo anche se si scorre? – Sid

+4

Puoi provare questa [libreria] (https://github.com/timehop/sticky-headers-recyclerview) Puoi impostare i layout personalizzati per gli articoli e le intestazioni, quindi penso che sia proprio quello che stai cercando – Cilenco

risposta

5

È necessario utilizzare il concetto di diversi tipi di visualizzazione utilizzando getItemViewType(int). Quindi su onCreateViewHolder(ViewGroup, int) è possibile verificare quale tipo si dovrebbe gonfiare/creare.

Esempio:

@Override 
public int getItemViewType(int position) { 
    // you should return the view type, based on your own dynamic logic 
} 

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    switch (viewType) { 
     // handle each view type accordingly 
    } 
} 
+0

Puoi fornire un link o un esempio? – mrid

0

È possibile utilizzare il concetto di molteplici tipi di vista nella vostra RecyclerView, semplicemente utilizzando getItemViewType(), e prendersi cura del parametro viewType in onCreateViewHolder().

Ad esempio è possibile utilizzare sotto modello:

public class Data{ 
      int field1; 
      float filed2; 
      int rowType // 1,2,2,...N this will fill by you whenever you will  
         //creating arraylist for your recyclerview 
    } 


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

    ArrayList<Data> mItems; 

    class ViewHolderRowType1 extends RecyclerView.ViewHolder { 
     ... 
    } 

    class ViewHolderRowType2 extends RecyclerView.ViewHolder { 
     ... 
    } 

    .... 
    class ViewHolderRowTypeN extends RecyclerView.ViewHolder { 
     ... 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return mItems.get(position).rowType; 
     //or 
     //return positon%2; // This will based on your condition   
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     switch (viewType) { 
      case 0: return new ViewHolderRowType0(...); 
      case 1: return new ViewHolderRowType1(...); 
      ... 
      case N: return new ViewHolderRowTypeN(...); 
     } 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder vh, int position) { 

    //Just check which view type is going to bind and then fill the data accordingly in your rows 


     if(vh instanceof ViewHolderRowType1){ 
     // Fill the data for first view type 


     } else if (vh instanceof ViewHolderRowType2) { 
     // Fill the data for second view type 


     } else if (vh instanceof ViewHolderRowTypeN){ 
     // Fill the data for Nth view type 


     } 

    } 

Per la vostra appiccicoso "questa visione debole", è possibile aggiungerlo in cima alla vostra RecyclerView e poi gestirlo per scorrimento evento di RecyclerView

0

ci sono due modi per implementare tale Aggiungi intestazione RecyclerView

  1. in ogni layout e Mostra/Nascondi basati sul vostro requisito (preferibile).
  2. Oppure utilizzare due layout diversi per intestazione e contenuto (non preferibile in quanto può causare problemi nel conteggio totale di elementi nell'adattatore).

nella vostra abitudine classe POJO/GetterSetter, aggiungere un campo per headerStatus (sia booleano o int), per identificare se mostrare intestazione oppure no.

Ora in adattatore prioritario public int getItemViewType(int position).

static final int TYPE_ITEM = 0; 
 
static final int TYPE_SEPARATOR = 1; 
 
@Override 
 
public int getItemViewType(int position) { 
 
\t if (mData.get(position).getHeaderStatus() == 0) 
 
\t \t return TYPE_ITEM; 
 
\t else 
 
\t \t return TYPE_SEPARATOR; 
 
}

Ora al momento del gonfiaggio del layout in getView() è possibile controllare il tipo di riga da

int rowType = getItemViewType(position);

Per il caso 1, è necessario visibile l'intestazione e impostare i dati appropriati in esso. Per il caso 2, è necessario gonfiare il layout dell'intestazione e aggiungere dati appropriati al suo interno.

0

Se si vuole fare in modo "corretto", senza hack, si dovrebbe scrivere il proprio LayoutManager e gestire tali casi con le mani. Non è così difficile come sembra, ma richiederà un certo sforzo.

+0

puoi fornire qualche esempio di layoutManager? –