Definir extensão para itens em GridLayoutManager usando SpanSizeLookup

90

Quero implementar um layout semelhante a uma grade com cabeçalhos de seção. Imagine https://github.com/TonicArtos/StickyGridHeaders

O que faço agora:

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

Agora, tanto os itens regulares quanto os cabeçalhos têm span size igual a 1. Como faço para resolver isso?

Igor Filippov
fonte
esta implementação parece correta para mim. Você depurou se mAdapter.getItemViewType(position)está retornando o valor correto?
yigit
1
"1" parece um valor padrão mais seguro do que "-1".
BladeCoder
Eu sou um novato Para mim, este link me ajudou a 3 exemplos de scroll infinito RecyclerView
Vijay Ram

Respostas:

158

O problema era que o cabeçalho deveria ter o tamanho do intervalo 2 e o item regular deveria ter o tamanho do intervalo 1. Portanto, as implementações corretas são:

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;
                }
            }
        });
Igor Filippov
fonte
13
O método get span size determina a quantidade de largura de span que sua célula vai receber e não o número de coluna que deveria ter !!
Karthik Rk
1
ao medir o primeiro item, está atrapalhando a altura dos próximos. Funciona em qualquer outro item. Qualquer ideia ?
Ronny Shibley de
1
@RonnyShibley qualquer solução para o problema que você declarou acima ... Também estou enfrentando o mesmo problema, o primeiro item após o cabeçalho não aparece, os outros são exibidos conforme necessário
Umair
Isso não está acordando.
Mahdi
34

O cabeçalho deve ter um intervalo igual à contagem do intervalo de toda a lista.

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;
                }
    }
});
Desenvolvedor Android
fonte
2

Resposta à minha própria pergunta: Substitua getSpanSizeLookup () da Activity após configurar o adaptador.

Rugved Mahamune
fonte