Установите диапазон для элементов в GridLayoutManager с помощью SpanSizeLookup

91

Я хочу реализовать макет в виде сетки с заголовками разделов. Подумайте о 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
Виджай Рам

Ответы:

160

Проблема заключалась в том, что заголовок должен иметь размер диапазона 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;
                }
            }
        });
Игорь Филиппов
источник
14
Метод получения размера диапазона определяет ширину диапазона, которую ваша ячейка будет принимать, а не количество строк столбца!
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;
                }
    }
});
Разработчик Android
источник
2

Ответ на мой собственный вопрос: переопределите getSpanSizeLookup () из Activity после настройки адаптера.

Прочный Махамун
источник