Establecer intervalo para elementos en GridLayoutManager usando SpanSizeLookup


90

Quiero implementar un diseño similar a una cuadrícula con encabezados de sección. Piense en https://github.com/TonicArtos/StickyGridHeaders

Qué hago ahora:

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

Ahora, tanto los elementos normales como los encabezados tienen un tamaño de tramo de 1. ¿Cómo soluciono esto?


esta implementación me parece correcta. ¿Depuraste si tu mAdapter.getItemViewType(position)devuelve el valor correcto?
yigit

1
"1" parece un valor predeterminado más seguro que "-1".
BladeCoder

Soy un novato Para mí, este enlace me ayudó 3 RecyclerView Infinite Scroll Examples
Vijay Ram

Respuestas:


158

El problema era que el encabezado debería tener un tamaño de tramo de 2 y el elemento normal debería tener un tamaño de tramo de 1. Así que las implementaciones correctas son:

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

13
¡El método de obtener tamaño de tramo determina la cantidad de ancho de tramo que va a tomar su celda, no el número de filas que debería tener!
Karthik Rk

1
al abarcar el primer elemento, está arruinando la altura de los siguientes. Funciona con cualquier otro elemento. Alguna idea ?
Ronny Shibley

1
@RonnyShibley cualquier solución para el problema que mencionó anteriormente ... También estoy enfrentando el mismo problema, el primer elemento después del encabezado no se muestra, los demás se muestran como se requiere
Umair

Esto no es woking.
Mahdi

34

El encabezado debe tener un intervalo igual al recuento de intervalos de toda la 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;
                }
    }
});

2

Respuesta a mi propia pregunta: Anule getSpanSizeLookup () de la Actividad después de configurar el adaptador.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.