Встановіть діапазон для елементів у GridLayoutManager за допомогою SpanSizeLookup


90

Я хочу реалізувати сітчастий макет із заголовками розділів. Подумайте про https://github.com/TonicArtos/StickyGridHeaders

Що я зараз роблю:

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

Тепер і звичайні елементи, і заголовки мають розмір 1. Як це вирішити?


це здійснення мені здається правильним. Ви налагоджували, якщо mAdapter.getItemViewType(position)повертає правильне значення?
yigit

1
"1" здається більш безпечним значенням за замовчуванням, ніж "-1".
BladeCoder

Я новачок. Мені це посилання допомогло 3 приклади нескінченного прокручування RecyclerView
Vijay Ram

Відповіді:


158

Проблема полягала в тому, що заголовок повинен мати розмір 2, а звичайний елемент - 1. Тож правильні реалізації:

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
get span size size визначає величину ширини діапазону, яку ваша комірка буде приймати, а не кількість рядків col!
Karthik Rk

1
коли охоплює перший предмет, це псує висоту наступного. Він працює з будь-яким іншим предметом. Будь-яка ідея?
Ронні Шиблі

1
@RonnyShibley будь-яке вирішення проблеми, про яку ви заявили вище ... Я також стикаюся з тією ж проблемою, перший пункт після заголовка не відображається, інші відображаються відповідно до вимог
Umair

Це не пробудження.
Махді

34

Заголовок повинен мати інтервал, рівний кількості діапазонів усього списку.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.