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

Я хочу реализовать сетчатый макет с заголовками секций. Подумайте о 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. Как это решить?

Ответы

Ответ 1

Проблема заключалась в том, что заголовок должен иметь размер диапазона 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;
                }
            }
        });

Ответ 2

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

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

Ответ 3

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