Установите диапазон для элементов в 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;
                }
    }
});

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.