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?

Igor Filippov
la source
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;
                }
            }
        });
Igor Filippov
la source
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;
                }
    }
});
Développeur Android
la source
2

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

Mahamune robuste
la source