Imposta l'intervallo per gli elementi in GridLayoutManager utilizzando SpanSizeLookup


90

Voglio implementare un layout a griglia con intestazioni di sezione. Pensa a https://github.com/TonicArtos/StickyGridHeaders

Cosa 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 sia gli elementi normali che le intestazioni hanno una dimensione dello span 1. Come risolvo questo problema?


questa implementazione mi sembra corretta. Hai eseguito il debug se mAdapter.getItemViewType(position)restituisci il valore corretto?
yigit

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

Sono un principiante. Per me, questo collegamento mi ha aiutato 3 esempi di scorrimento infinito di RecyclerView
Vijay Ram

Risposte:


158

Il problema era che l'intestazione dovrebbe avere una dimensione di estensione pari a 2 e l'elemento normale dovrebbe avere una dimensione di estensione pari a 1. Quindi le implementazioni corrette sono:

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;
                }
            }
        });

13
ottieni il metodo della dimensione dello span determina la quantità di larghezza dello span che la tua cella prenderà, non il numero di colonne che dovrebbero avere !!
Karthik Rk

1
quando si estende il primo elemento, si altera l'altezza di quelli successivi. Funziona su qualsiasi altro oggetto. Qualche idea ?
Ronny Shibley

1
@RonnyShibley qualsiasi soluzione per il problema che hai indicato sopra ... Sto anche affrontando lo stesso problema, il primo elemento dopo che l'intestazione non viene visualizzata, gli altri vengono tutti visualizzati come richiesto
Umair

Questo non è sveglia.
Mahdi

34

L'intestazione dovrebbe avere un intervallo uguale al numero di intervalli dell'intero elenco.

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;
                }
    }
});

2

Risposta alla mia domanda: Sostituisci getSpanSizeLookup () dall'attività dopo aver impostato l'adattatore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.