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