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?

Igor Filippov
fuente
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;
                }
            }
        });
Igor Filippov
fuente
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;
                }
    }
});
Desarrollador de Android
fuente
2

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

Mahamune rugoso
fuente