Este es un ejemplo de cómo podría haberse hecho previamente en la ListView
clase, utilizando los parámetros divider y dividerHeight :
<ListView
android:id="@+id/activity_home_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@android:color/transparent"
android:dividerHeight="8dp"/>
Sin embargo, no veo esa posibilidad en la RecyclerView
clase.
<android.support.v7.widget.RecyclerView
android:id="@+id/activity_home_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"/>
En ese caso, ¿está bien definir márgenes y / o agregar una vista divisoria personalizada directamente en el diseño de un elemento de lista o hay una mejor manera de lograr mi objetivo?
android
android-recyclerview
divider
Ojos claros
fuente
fuente
com.homeretailgroup.argos.android.view.decorators.DividerItemDecoration
ymRecyclerView.addItemDecoration(new DividerItemDecoration(activity, LinearLayoutManager.VERTICAL));
Respuestas:
Actualización de octubre de 2016
La versión 25.0.0 de Android Support Library introdujo la
DividerItemDecoration
clase:Uso:
Respuesta anterior
Algunas respuestas usan métodos que han quedado obsoletos, o no dan una solución completa, por lo que intenté hacer un resumen breve y actualizado.
A diferencia
ListView
, laRecyclerView
clase no tiene parámetros relacionados con el divisor. En cambio, necesita extenderItemDecoration
,RecyclerView
la clase interna de a:Vertical
espaciadoItemDecoration
Extienda
ItemDecoration
, agregue un constructor personalizado que tome espacioheight
como parámetro ygetItemOffsets()
método de anulación :Si no desea insertar espacio debajo del último elemento, agregue la siguiente condición:
Nota: también se puede modificar
outRect.top
,outRect.left
youtRect.right
propiedades para el efecto deseado.Divisor
ItemDecoration
Método de extensión
ItemDecoration
y anulaciónonDraw()
:Puede llamar al primer constructor que usa los atributos de divisor de Android predeterminados, o al segundo que usa su propio dibujable, por ejemplo drawable / divider.xml
Nota: si desea que el divisor se dibuje sobre sus elementos, anule el
onDrawOver()
método en su lugar.Uso
Para usar su nueva clase add
VerticalSpaceItemDecoration
oDividerSpaceItemDecoration
toRecyclerView
, por ejemplo en elonCreateView()
método de su fragmento :También está la biblioteca de Lucas Rocha, que se supone que simplifica el proceso de decoración del artículo. Aunque no lo he intentado.
Entre sus características están:
fuente
onDraw()
. Solo hago referencia a instancias ya existentes.canvas.drawLine(startX, startY, stopX, stopY, mPaint)
enonDrawOver
? ¿Alguna diferencia de rendimiento?Solo agrega
También es posible que deba agregar la dependencia
compile 'com.android.support:recyclerview-v7:27.1.0'
EDITAR:
Para personalizarlo un poco, puede agregar un dibujo personalizado:
Puede usar cualquier dibujo personalizado, por ejemplo:
fuente
Configuration
para el divisor vertical:if (orientation == Configuration.ORIENTATION_LANDSCAPE) { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL)); } else { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));}
¿Puedo dirigir su atención a este archivo en particular en Github por Alex Fu: https://gist.github.com/alexfu/0f464fc3742f134ccd1e
Es el archivo de ejemplo DividerItemDecoration.java "extraído directamente de las demostraciones de soporte". ( Https://plus.google.com/103498612790395592106/posts/VVEB3m7NkSS )
Pude obtener líneas divisorias muy bien después de importar este archivo en mi proyecto y agregarlo como decoración de un elemento a la vista del reciclador.
Así es como se ve mi onCreateView en mi fragmento que contiene la vista Recycler:
Estoy seguro de que se puede hacer un estilo adicional, pero es un punto de partida. :)
fuente
ItemDecoration
Implementación simple para espacios iguales entre todos los elementos.fuente
getChildPosition
ahora está en desuso,getChildAdapterPosition
se puede usar en su lugar.super.getItemOffsets
, o sus compensaciones se sobrescribirán.getChildLayoutPosition
usarse?La simple es establecer el color de fondo para RecyclerView y un color de fondo diferente para los elementos. Aquí hay un ejemplo ...
y el elemento TextView (aunque puede ser cualquier cosa) con margen inferior "x" dp o px.
La salida ...
fuente
Creo que usar un divisor simple lo ayudará
a agregar un divisor a cada elemento:
1- Agregue esto al directorio dibujable line_divider.xml
2- Crear clase SimpleDividerItemDecoration
Utilicé este ejemplo para definir esta clase:
https://gist.github.com/polbins/e37206fbc444207c0e92
3- En la actividad o fragmento que usa RecyclerView, dentro de onCreateView agrega esto:
4- Para agregar espacio entre los elementos
, solo necesita agregar la propiedad de relleno a la vista del elemento
fuente
Como he establecido
ItemAnimators
. losItemDecorator
no entrar o salir junto con la animación.Simplemente terminé teniendo una línea de vista en mi archivo de diseño de vista de elemento de cada elemento. Resolvió mi caso.
DividerItemDecoration
se sentía demasiado hechicero para un simple divisor.fuente
Esto es simple, no necesitas un código tan complicado
Agregue esto en su dibujo: line_divider.xml
fuente
Dado que todavía no hay una forma correcta de implementar esto correctamente usando Material Design, acabo de hacer el siguiente truco para agregar un divisor en el elemento de la lista directamente:
fuente
La forma en que estoy manejando la vista del divisor y también las inserciones del divisor es agregando una extensión RecyclerView.
1)
Agregue un nuevo archivo de extensión nombrando View o RecyclerView:
y agregue el
setDivider
método de extensión dentro del archivo RecyclerViewExtension.kt.2)
Cree un archivo de recursos Drawable dentro del
drawable
paquete comorecycler_view_divider.xml
:donde puede especificar el margen izquierdo y derecho en
android:insetLeft
yandroid:insetRight
.3)
En su Actividad o Fragmento donde se inicializa RecyclerView, puede establecer el dibujo personalizado llamando a:
4)
Saludos 🍺
fuente
Si alguien está buscando agregar solo, digamos, un espacio de 10dp entre elementos, puede hacerlo estableciendo un dibujable para
DividerItemDecoration
:¿Dónde
divider_10dp
está un recurso extraíble que contiene:fuente
ACTUALIZACIÓN OCTUBRE 2016
Con la biblioteca de soporte v25.0.0, finalmente hay una implementación predeterminada de divisores horizontales y verticales básicos disponibles.
https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html
fuente
En realidad, esto no resuelve el problema, pero como solución temporal, puede establecer la propiedad useCompatPadding en la tarjeta en su diseño XML para que mida lo mismo que en las versiones anteriores a Lollipop.
fuente
Para aquellos que están buscando sólo para los espacios entre los elementos en el
RecyclerView
ver a mi enfoque en el que se obtiene espacios iguales entre todos los elementos, excepto en los primeros y últimos artículos donde di un acolchado más grande. Solo aplico relleno a izquierda / derecha en horizontalLayoutManager
y a arriba / abajo en verticalLayoutManager
.dimens.xml
fuente
Agregue un margen a su vista, funcionó para mí.
Si solo desea agregar un espaciado igual y desea hacerlo en XML , simplemente establezca
padding
su valorRecyclerView
y la misma cantidad dellayoutMargin
elemento que infla en suRecyclerView
, y deje que el color de fondo determine el color del espaciado.fuente
overscroll
efecto al tirar al final de la lista tendrá un relleno innecesario aplicado cuando se aplique el rellenoRecyclerView
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" card_view:cardElevation="4dp" <!-- your item's XML here --> </android.support.v7.widget.CardView>
Simplemente agregue un fondo al diseño de su elemento de reciclaje de la siguiente manera
Cree el siguiente shape_border.xml en la carpeta dibujable
Aquí está el resultado final: un RecyclerView con divisor.
fuente
parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1
probablemente debería serparent.getChildAdapterPosition(view) > 0
con eloutRect.bottom = mVerticalSpaceHeight
deveniroutRect.top = mVerticalSpaceHeight
, debería ser la respuesta aceptada.Bifurqué el DividerItemDecoration de una esencia anterior y lo simplifiqué para que se adaptara a mi caso de uso, y también lo modifiqué para dibujar los divisores de la forma en que se dibujan en ListView, incluido un divisor después del último elemento de la lista. Esto también manejará animaciones verticales de ItemAnimator:
1) Agregue esta clase a su proyecto:
2) Agregue el decorador a su RecylerView:
fuente
En lugar de crear un
shape xml
cambio, la altura y el color del divisor. Puedes crear programáticamente comofuente
Tomado de una búsqueda en google, agregue este ItemDecoration a su
RecyclerView
:fuente
Este enlace funcionó como un encanto para mí:
https://gist.github.com/lapastillaroja/858caf1a82791b6c1a36
Luego en tu actividad:
O esto si estás usando un fragmento:
fuente
mShowFirstDivider = false
,mShowLastDivider = true
, pero no va a funcionar. ¿Alguna idea de por qué?Podemos decorar los artículos usando varios decoradores adjuntos a la vista del reciclador, como la DividerItemDecoration:
Simplemente use lo siguiente ... tomado de la respuesta de EyesClear
} y luego use lo anterior de la siguiente manera
Esto mostrará divisores entre cada elemento dentro de la lista como se muestra a continuación:
Y para aquellos que buscan más detalles, pueden consultar esta guía Uso de RecyclerView _ CodePath Android Cliffnotes
Algunas respuestas aquí sugieren el uso de márgenes, pero el problema es que: si agrega los márgenes superior e inferior, aparecerán agregados entre los elementos y serán demasiado grandes. Si solo agrega cualquiera, no habrá margen en la parte superior o inferior de toda la lista. Si agrega la mitad de la distancia en la parte superior, la mitad en la parte inferior, los márgenes exteriores serán demasiado pequeños.
Por lo tanto, la única solución estéticamente correcta es el divisor que el sistema sabe dónde aplicar correctamente: entre elementos, pero no arriba o debajo de los elementos.
Por favor, hágame saber cualquier duda en los comentarios a continuación :)
fuente
DividerItemDecoration
aspecto del código.Demasiado tarde, pero
GridLayoutManager
yo uso esto:Este trabajo para cualquier recuento de tramo que tenga.
Ollie.
fuente
FlexboxLayoutManager
?Puede agregar con programáticamente fácil.
Si su Administrador de diseño es Linearlayout, puede usar:
fuente
fuente
Siento que hay una necesidad de una respuesta simple basada en código que no use XML
fuente
Si desea agregar el mismo espacio para los elementos, la forma más simple es agregar el relleno superior + izquierdo para RecycleView y los márgenes derecho + inferior a los elementos de la tarjeta.
dimens.xml
list_item.xml
list.xml
fuente
He agregado una línea en el elemento de la lista como a continuación
1px dibujará la línea delgada.
fuente
El
RecyclerView
es un poco diferente delListView
. En realidad,RecyclerView
necesita unaListView
estructura similar. Por ejemplo, aLinearLayout
. ElLinearLayout
tiene parámetros para la división de cada elemento. En el siguiente código, tengo un conjuntoRecyclerView
deCardView
objetos dentro de aLinearLayout
con un "relleno" que pondrá algo de espacio entre los elementos. Haz ese espacio realmente pequeño y obtendrás una línea.Aquí está la vista Recycler en recyclerview_layout.xml
Y así es como se ve cada elemento (y se muestra como dividido debido al androide: relleno en el diseño lineal que rodea todo) en otro archivo: cards_layout.xml
fuente
Una solución realmente fácil es usar RecyclerView-FlexibleDivider
Añadir dependencia:
Agregue a su vista de reciclador:
¡Y tu estas listo!
fuente
1.Una de las formas es mediante el uso de la vista de tarjeta y la vista de reciclador juntos , podemos agregar fácilmente efectos como divisor. ex. https://developer.android.com/training/material/lists-cards.html
2.y otro es agregando la vista como divisor a list_item_layout de la vista del reciclador .
fuente
Esto agregará espacio en la parte superior e inferior de cada elemento (o izquierda y derecha). Luego, puede configurarlo en su
recyclerView
.SizeUtils.java
fuente