Définir l'étendue des éléments dans GridLayoutManager à l'aide de SpanSizeLookup


90

Je veux implémenter une disposition en forme de grille avec des en-têtes de section. Pensez à https://github.com/TonicArtos/StickyGridHeaders

Ce que je fais maintenant:

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

Désormais, les éléments normaux et les en-têtes ont une taille de portée de 1. Comment résoudre ce problème?


cette implémentation me semble correcte. Avez-vous débogué si votre mAdapter.getItemViewType(position)renvoie la valeur correcte?
yigit

1
"1" semble être une valeur par défaut plus sûre que "-1".
BladeCoder

Je suis un novice. Pour moi, ce lien m'a aidé 3 Exemples RecyclerView Infinite Scroll
Vijay Ram

Réponses:


158

Le problème était que l'en-tête devait avoir une taille de portée de 2 et que l'élément normal devait avoir une taille de portée de 1. Les implémentations correctes sont donc:

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
La méthode get span size détermine la largeur de portée que votre cellule va prendre et non le nombre de lignes de cols devrait avoir !!
Karthik Rk

1
en couvrant le premier élément, cela gâche la hauteur des suivants. Cela fonctionne sur tout autre élément. Une idée ?
Ronny Shibley

1
@RonnyShibley n'importe quelle solution pour le problème que vous avez indiqué ci-dessus ... Je suis également confronté au même problème, le premier élément après l'en-tête ne s'affiche pas, les autres sont tous affichés comme requis
Umair

Ce n'est pas de la réveil.
Mahdi

34

L'en-tête doit avoir une étendue égale au nombre d'étendues de la liste entière.

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

Réponse à ma propre question: remplacez le getSpanSizeLookup () de l'activité après avoir configuré l'adaptateur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.