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?

Igor Filippov
quelle
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;
                }
            }
        });
Igor Filippov
quelle
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;
                }
    }
});
Android-Entwickler
quelle
2

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

Rugved Mahamune
quelle