68

Desidero implementare un layout simile alla griglia con intestazioni di sezione. Pensate a https://github.com/TonicArtos/StickyGridHeadersImpostare l'intervallo per gli elementi in GridLayoutManager utilizzando SpanSizeLookup

quello che faccio ora:

mRecyclerView = (RecyclerView) view.findViewById(R.id.grid); 
mLayoutManager = new GridLayoutManager(getActivity(), 2); 
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
      @Override 
      public int getSpanSize(int position) { 
       switch(mAdapter.getItemViewType(position)){ 
        case MyAdapter.TYPE_HEADER: 
         return 1; 
        case MyAdapter.TYPE_ITEM: 
         return 2; 
        default: 
         return -1; 
       } 
      } 
     }); 

mRecyclerView.setLayoutManager(mLayoutManager); 

Ora entrambi gli elementi regolari e le intestazioni hanno dimensioni arco di 1. Come posso risolvere questo?

+0

questa implementazione mi sembra corretta. Hai eseguito il debug se il tuo 'mAdapter.getItemViewType (position)' sta restituendo il valore corretto? – yigit

+0

"1" sembra un valore predefinito più sicuro di "-1". – BladeCoder

risposta

109

Il problema era che un colpo di testa dovrebbe avere dimensioni arco di 2, e la voce regolare dovrebbe avere dimensioni arco di 1. implementazioni Così corretta è:

mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
      @Override 
      public int getSpanSize(int position) { 
       switch(mAdapter.getItemViewType(position)){ 
        case MyAdapter.TYPE_HEADER: 
         return 2; 
        case MyAdapter.TYPE_ITEM: 
         return 1; 
        default: 
         return -1; 
       } 
      } 
     }); 
+8

get span size method determina la quantità di ampiezza della cella che la tua cella sta per prendere, non il numero di colonne che dovrebbero avere !! –

+0

quando si estende il primo elemento, si sta rovinando l'altezza di quelli successivi. Funziona su qualsiasi altro oggetto. Qualche idea ? –

+0

@RonnyShibley qualsiasi soluzione per il problema che hai dichiarato in precedenza ... Anch'io sto affrontando lo stesso problema, il primo elemento dopo l'intestazione non viene mostrato, altri sono tutti visualizzati come richiesto – Umair

19

Header dovrebbe avere una durata uguale al conteggio arco di l'intera lista.

mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
    @Override 
    public int getSpanSize(int position) { 
      switch(mAdapter.getItemViewType(position)){ 
        case MyAdapter.TYPE_HEADER: 
         return mLayoutManager.getSpanCount(); 
        case MyAdapter.TYPE_ITEM: 
         return 1; 
        default: 
         return -1; 
       } 
    } 
}); 
1

risposta alla mia domanda: Override il getSpanSizeLookup() dalla attività dopo aver impostato l'adattatore.