Ustaw zakres dla elementów w GridLayoutManager przy użyciu SpanSizeLookup


92

Chcę zaimplementować układ podobny do siatki z nagłówkami sekcji. Pomyśl o https://github.com/TonicArtos/StickyGridHeaders

Co ja teraz robię:

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

Teraz zarówno zwykłe elementy, jak i nagłówki mają rozmiar rozpiętości 1. Jak to rozwiązać?


ta implementacja wydaje mi się poprawna. Czy debugowałeś, jeśli mAdapter.getItemViewType(position)zwraca prawidłową wartość?
yigit

1
„1” wydaje się bezpieczniejszą wartością domyślną niż „-1”.
BladeCoder

Jestem nowicjuszem. Dla mnie ten link pomógł mi 3 RecyclerView Infinite Scroll Przykłady
Vijay Ram

Odpowiedzi:


160

Problem polegał na tym, że nagłówek powinien mieć rozmiar rozpiętości 2, a zwykły element powinien mieć rozmiar rozpiętości 1. Tak więc poprawne implementacje to:

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

14
metoda get span size określa, jaką szerokość rozpiętości zajmie komórka, a nie tyle, ile powinien mieć wiersz kolumny !!
Karthik Rk

1
przy rozpinaniu pierwszego elementu psuje wysokość następnych. Działa na każdym innym elemencie. Dowolny pomysł ?
Ronny Shibley

1
@RonnyShibley każde rozwiązanie problemu, o którym wspomniałeś powyżej ... Mam również ten sam problem, pierwsza pozycja po nagłówku się nie wyświetla, inne są wyświetlane zgodnie z wymaganiami
Umair

To się nie budzi.
Mahdi

35

Nagłówek powinien mieć rozpiętość równą liczbie rozpiętości całej listy.

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

Odpowiedź na moje własne pytanie: po ustawieniu adaptera zastąp metodę getSpanSizeLookup () z działania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.