¿Cómo se configura el espaciado de columna con un RecyclerView usando un GridLayoutManager? Establecer el margen / relleno dentro de mi diseño no tiene ningún efecto.
251
¿Cómo se configura el espaciado de columna con un RecyclerView usando un GridLayoutManager? Establecer el margen / relleno dentro de mi diseño no tiene ningún efecto.
GridLayoutManager
y anulargenerateDefaultLayoutParams()
y parientes?Respuestas:
RecyclerViews admite el concepto de ItemDecoration : compensaciones especiales y dibujo alrededor de cada elemento. Como se ve en esta respuesta , puede usar
Luego agréguelo a través de
fuente
RecyclerView
(y usoclipToPadding="false"
), entonces puedes reestructurar las cosas ligeramente. Sin embargo, si no lo hace, solo movería el control if para que sea la última vez (ya que aún querría el relleno inferior en el último elemento).GridLayoutManager
. La respuesta no funcionará en diseños de varias columnas / filasEl siguiente código funciona bien y cada columna tiene el mismo ancho:
Uso
1. sin filo
2. con borde
fuente
La siguiente es la solución simple paso a paso si desea un espacio igual alrededor de los elementos y tamaños de elementos iguales.
ItemOffsetDecoration
Implementación
En su código fuente,
ItemOffsetDecoration
elRecyclerView.
valor de compensación de su elemento debe ser la mitad del valor real que desea agregar como espacio entre los elementos.Además, establezca el valor de desplazamiento del elemento como relleno para su
RecyclerView
, y especifiqueandroid:clipToPadding=false
.fuente
Prueba esto. Se encargará de un espacio igual alrededor. Funciona tanto con List, Grid y StaggeredGrid.
Editado
El código actualizado debe manejar la mayoría de los casos de esquina con tramos, orientación, etc. Tenga en cuenta que si usa setSpanSizeLookup () con GridLayoutManager, se recomienda establecer setSpanIndexCacheEnabled () por razones de rendimiento.
Tenga en cuenta que parece que con StaggeredGrid, parece haber un error en el que el índice de los niños se vuelve extraño y difícil de rastrear, por lo que el código a continuación podría no funcionar muy bien con StaggeredGridLayoutManager.
Espero eso ayude.
fuente
El siguiente código manejará StaggeredGridLayoutManager, GridLayoutManager y LinearLayoutManager.
Entonces úsalo
fuente
SpaceItemDecoration
realidad, agrega el relleno al padre (la vista del reciclador).halfSpace
apareció el relleno (en el lado derecho) cuando no había configurado el relleno para el padre en xmlAquí hay una solución que no requiere "spanCount" (número de columnas). Lo uso porque uso GridAutofitLayoutManager (calcula el número de columnas de acuerdo con el tamaño de celda requerido)
(tenga en cuenta que esto solo funcionará en GridLayoutManager )
Aquí está el GridAutofitLayoutManager si alguien está interesado:
Finalmente:
fuente
layoutManager.getPosition(view)
luego de verificar si la posición es cero, ese será su encabezado ... además, de esta manera le permitirá agregar otro encabezado en las posiciones que desee :)Solo hay una solución fácil, que puede recordar e implementar donde sea necesario. Sin errores, sin cálculos locos. Ponga margen en el diseño de la tarjeta / elemento y ponga el mismo tamaño que el relleno en RecyclerView:
item_layout.xml
activity_layout.xml
ACTUALIZAR:
fuente
Si desea FIJAR el tamaño de su
RecyclerView
artículo en todos los dispositivos. Puedes hacer asirecyclerview_item.xml
dimens.xml
Actividad
fuente
La respuesta seleccionada es casi perfecta, pero dependiendo del espacio, el ancho de los elementos puede no ser igual. (En mi caso fue crítico). Así que terminé con este código que aumenta un poco el espacio, por lo que todos los elementos tienen el mismo ancho.
fuente
columnCount == 1 -> { outRect.left = space outRect.right = space }
Copié el código proporcionado por @edwardaa y lo hago perfecto para admitir RTL:
fuente
Las respuestas anteriores han aclarado formas de establecer el manejo de márgenes GridLayoutManager y LinearLayoutManager.
Pero para StaggeredGridLayoutManager, la respuesta de Pirdad Sakhizada dice: "Puede que no funcione muy bien con StaggeredGridLayoutManager". Debería ser el problema sobre IndexOfSpan.
Puede obtenerlo de esta manera:
fuente
Un poco diferente de la respuesta de edwardaa, la diferencia es cómo se determina la columna, porque en casos como elementos con varias alturas, la columna no se puede determinar simplemente por%
spanCount
fuente
fuente
Aquí está mi modificación de
SpacesItemDecoration
que puede tomar numOfColums y espacio igualmente en la parte superior, inferior, izquierda y derecha .y use el siguiente código en su lógica.
fuente
Hay una solución muy simple pero flexible para este problema usando solo XML que funciona en cada LayoutManager.
Suponga que desea un espaciado igual de X (8dp por ejemplo).
Envuelva su elemento CardView en otro diseño
Dele al diseño exterior un relleno de X / 2 (4dp)
Haga que el fondo del diseño exterior sea transparente
...
...
y eso es. Tienes un espaciado perfecto de X (8dp).
fuente
Para aquellos que tienen problemas con staggeredLayoutManager (como https://imgur.com/XVutH5u )
Los métodos de recyclerView:
a veces devuelve -1 como índice, por lo que podríamos tener problemas para configurar itemDecor. Mi solución es anular el método obsoleto de ItemDecoration:
en lugar del novato:
Me gusta esto:
Parece que funciona para mí hasta ahora :)
fuente
Las respuestas a esta pregunta parecen más complejas de lo que deberían ser. Aquí está mi opinión sobre esto.
Digamos que desea un espacio de 1dp entre los elementos de la cuadrícula. Haz lo siguiente:
fuente
Esto también funcionará
RecyclerView
con el encabezado.fuente
La respuesta de yqritc funcionó perfectamente para mí. Sin embargo, estaba usando Kotlin, así que aquí está el equivalente de eso.
Todo lo demás es lo mismo.
fuente
Para los usuarios de StaggeredGridLayoutManager , tenga cuidado, muchas respuestas aquí, incluida la más votada, calcula la columna del elemento con el siguiente código:
que supone que los elementos 1º / 3º / 5º / .. siempre se encuentran en el lado izquierdo y los elementos 2º / 4º / 6º / .. siempre se encuentran en el lado derecho. ¿Es esta suposición siempre cierta? No.
Digamos que su primer elemento tiene 100dp de alto y el segundo solo tiene 50dp, adivine dónde está ubicado su tercer elemento, ¿izquierda o derecha?
fuente
Terminé haciéndolo así para mi RecyclerView con GridLayoutManager y HeaderView .
En el siguiente código, configuro un espacio de 4dp entre cada elemento (2dp alrededor de cada elemento individual y un relleno de 2dp alrededor de toda la vista del reciclador).
layout.xml
fragmento / actividad
SpaceItemDecoration.java
Utils.java
fuente
Para que la solución https://stackoverflow.com/a/29905000/1649371 (arriba) funcionara, tuve que modificar los siguientes métodos (y todas las llamadas posteriores)
fuente
Este enlace funcionó para mí en todas las situaciones, puede intentar esto.
fuente
Si tiene un interruptor de alternancia que alterna entre la lista y la cuadrícula, no olvide llamar
recyclerView.removeItemDecoration()
antes de configurar cualquier decoración de elemento nueva. De lo contrario, los nuevos cálculos para el espaciado serían incorrectos.Algo como esto.
fuente
Si está utilizando Encabezado con GridLayoutManager, use este código escrito en kotlin para espaciar entre las cuadrículas:
Y pasar
ItemDecoration
arecyclerview
comofuente
Al usar CardView para niños, el problema con los espacios entre los elementos se puede resolver configurando app: cardUseCompatPadding en true.
Para márgenes más grandes, aumente la elevación del elemento. CardElevation es opcional (use el valor predeterminado).
fuente
gracias respuesta de edwardaa https://stackoverflow.com/a/30701422/2227031
Otro punto a tener en cuenta es que:
Si el espaciado total y el ancho total del elemento no son iguales al ancho de la pantalla, también debe ajustar el ancho del elemento, por ejemplo, en el método del adaptador onBindViewHolder
fuente
Una versión de Kotlin que hice basada en la gran respuesta de edwardaa
fuente