Legen Sie mit SpanSizeLookup die Spanne für Elemente in GridLayoutManager fest


90

Ich möchte ein gitterartiges Layout mit Abschnittsüberschriften implementieren. Denken Sie an https://github.com/TonicArtos/StickyGridHeaders

Was mache ich nun:

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

Jetzt haben sowohl reguläre Elemente als auch Header eine Bereichsgröße von 1. Wie löse ich das?


Diese Implementierung sieht für mich richtig aus. Haben Sie debuggt, wenn Sie mAdapter.getItemViewType(position)den richtigen Wert zurückgeben?
Yigit

1
"1" scheint ein sicherer Standardwert als "-1" zu sein.
BladeCoder

Ich bin ein Neuling. Für mich hat dieser Link mir geholfen, 3 RecyclerView Infinite Scroll-Beispiele
Vijay Ram

Antworten:


157

Das Problem war, dass der Header eine Bereichsgröße von 2 und das reguläre Element eine Bereichsgröße von 1 haben sollte. Die korrekte Implementierung lautet also:

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
Die Methode zum Abrufen der Spannengröße bestimmt die Größe der Spannenbreite, die Ihre Zelle aufnehmen soll, nicht die Anzahl der Spalten, die die Spalte haben sollte !!
Karthik Rk

1
Wenn der erste Gegenstand überspannt wird, wird die Höhe des nächsten durcheinander gebracht. Es funktioniert bei jedem anderen Gegenstand. Irgendeine Idee ?
Ronny Shibley

1
@RonnyShibley jede Lösung für das Problem, das Sie oben angegeben haben ... Ich bin auch mit dem gleichen Problem konfrontiert, erster Punkt, nachdem der Header nicht angezeigt wird, andere werden alle nach Bedarf angezeigt
Umair

Das wacht nicht auf.
Mahdi

33

Der Header sollte eine Spanne haben, die der Spannenanzahl der gesamten Liste entspricht.

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

Antwort auf meine eigene Frage: Überschreiben Sie getSpanSizeLookup () aus der Aktivität, nachdem Sie den Adapter eingestellt haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.