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ć?

Igor Filippov
źródło
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;
                }
            }
        });
Igor Filippov
źródło
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;
                }
    }
});
Programista Androida
źródło
2

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

Rugved Mahamune
źródło