¿Cómo se puede agregar una línea de divisor en un Android RecyclerView?
Estoy desarrollando una aplicación de Android donde estoy usando RecyclerView
. Necesito agregar un divisor en RecyclerView
. Traté de añadir –
recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
Abajo está mi código xml –
- ¿Cómo aplicar setItemChecked (position, true) con RecyclerView en Android?
- ¿Cómo desplazar el RecyclerView de forma programática por unos píxeles específicos?
- NotifyDataSetChanged no funciona en RecyclerView
- RecyclerView scrollToPosition no dispara scrollListener
- Las animaciones de elementos predictivos de RecyclerView no funcionan (APPEARING)
<android.support.v7.widget.RecyclerView android:id="@+id/drawerList" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" />
- Diseño cuadrado en GridLayoutManager para RecyclerView
- Problemas para conseguir que el video se reproduzca en Recyclerview
- StaggeredGridLayoutManager y elementos en movimiento
- ¿Cómo puedo dibujar ItemDecoration correctamente cuando el elemento RecyclerView está animando su altura?
- Android RecyclerView desplazamiento suave para ver que está animando su altura
- ¿Cómo obtener información sobre el toque de RecyclerView?
- ¿Cómo guardar y restaurar la posición exacta de desplazamiento de RecyclerView?
- Android: la adición de vistas a las imágenes no se actualiza - onClick
La forma correcta es definir ItemDecoration
para el RecyclerView
es como sigue
SimpleDividerItemDecoration.java
public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; public SimpleDividerItemDecoration(Context context) { mDivider = context.getResources().getDrawable(R.drawable.line_divider); } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int top = child.getBottom() + params.bottomMargin; int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } }
Line_divider.xml:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <size android:width="1dp" android:height="1dp" /> <solid android:color="@color/dark_gray" /> </shape>
Finalmente, ponlo así
recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));
Editar
Como señaló @Alan Solitar
context.getResources().getDrawable(R.drawable.line_divider);
Se deprecia en lugar de que puede utilizar
ContextCompat.getDrawable(context,R.drawable.line_divider);
En la actualización de octubre de 2016, la biblioteca de soporte v25.0.0 ahora tiene una implementación por defecto de divisores horizontales y verticales básicos disponibles!
https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html
mDividerItemDecoration = new DividerItemDecoration( recyclerView.getContext(), mLayoutManager.getOrientation() ); recyclerView.addItemDecoration(mDividerItemDecoration);
Simplemente agregue una vista al final de su adaptador de artículo:
<View android:layout_width="match_parent" android:layout_height="1px" android:background="#FFFFFF"/>
Si desea tener divisores horizontales y verticales:
-
Definir divisores horizontales y verticales:
Horizontal_divider.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <size android:height="1dip" /> <solid android:color="#22000000" /> </shape>
Vertical_divider.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <size android:width="1dip" /> <solid android:color="#22000000" /> </shape>
-
Añadir este segmento de código a continuación:
DividerItemDecoration verticalDecoration = new DividerItemDecoration(recyclerview.getContext(), DividerItemDecoration.HORIZONTAL); Drawable verticalDivider = ContextCompat.getDrawable(getActivity(), R.drawable.vertical_divider); verticalDecoration.setDrawable(verticalDivider); recyclerview.addItemDecoration(verticalDecoration); DividerItemDecoration horizontalDecoration = new DividerItemDecoration(recyclerview.getContext(), DividerItemDecoration.VERTICAL); Drawable horizontalDivider = ContextCompat.getDrawable(getActivity(), R.drawable.horizontal_divider); horizontalDecoration.setDrawable(horizontalDivider); recyclerview.addItemDecoration(horizontalDecoration);
Aquí está el código de un divisor personalizado simple (divisor vertical / 1dp altura / negro):
Supongamos que tiene la biblioteca de soporte:
compile "com.android.support:recyclerview-v7:25.1.1"
Código java
DividerItemDecoration divider = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL); divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.my_custom_divider)); recyclerView.addItemDecoration(divider);
Entonces el ejemplo del archivo custom_divider.xml:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <size android:height="1dp" /> <solid android:color="@android:color/black" /> </shape>
Todas estas respuestas me acercaron, pero cada uno de ellos faltaba un detalle clave. Después de un poco de investigación, encontré la ruta más fácil para ser una combinación de estos 3 pasos:
- Utilice DividerItemDecoration de la biblioteca de soporte
- Crear un divisor con el color correcto
- Establezca este divisor en su tema como el listDivider
Paso 1: durante la configuración de RecyclerView
recyclerView.addItemDecoration( new DividerItemDecoration(context, layoutManager.getOrientation()));
Paso 2: en un archivo como res / drawable / divider_gray.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <size android:width="1px" android:height="1px" /> <solid android:color="@color/gray" /> </shape>
Paso 3: en el tema de la aplicación
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Other theme items above --> <item name="android:listDivider">@drawable/divider_gray</item> </style>
EDIT: Actualizado para omitir el último divisor:
Después de usar esto un poco, me di cuenta de que estaba dibujando un divisor después del último elemento, que era molesto. Por lo tanto, modifiqué el paso 1 de la siguiente manera para reemplazar el comportamiento predeterminado en DividerItemDecoration (por supuesto, hacer que una clase independiente sea otra opción):
recyclerView.addItemDecoration( new DividerItemDecoration(context, layoutManager.getOrientation())) { @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int position = parent.getChildAdapterPosition(view); // hide the divider for the last child if (position == parent.getAdapter().getItemCount() - 1) { outRect.setEmpty(); } else { super.getItemOffsets(outRect, view, parent, state); } } } );
Así que esto podría no ser la forma correcta, pero acabo de agregar una vista a la vista de elemento único del recyclerView (como no creo que haya una función incorporada) como así:
<View android:layout_width="fill_parent" android:layout_height="@dimen/activity_divider_line_margin" android:layout_alignParentBottom="true" android:background="@color/tasklist_menu_dividerline_grey" />
Esto significa que cada artículo tendrá una línea que lo llene en su parte inferior. Lo hice sobre 1dp alto con un fondo # 111111. Esto también le da una especie de efecto "3D".
El RecyclerView-FlexibleDivider de yqritc hace de este un solo revestimiento. Primero agregue esto a su build.gradle
:
compile 'com.yqritc:recyclerview-flexibledivider:1.4.0' // requires jcenter()
Ahora puede configurar y agregar un divisor donde establezca el adaptador de recyclerView:
recyclerView.setAdapter(myAdapter); recyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this).color(Color.RED).sizeResId(R.dimen.divider).marginResId(R.dimen.leftmargin, R.dimen.rightmargin).build());
Para hacer la respuesta de NJ un poco más simple que usted puede hacer:
public class DividerColorItemDecoration extends DividerItemDecoration { public DividerColorItemDecoration(Context context, int orientation) { super(context, orientation); setDrawable(ContextCompat.getDrawable(context, R.drawable.line_divider)); } }
Android sólo hace cosas pequeñas demasiado complicado por desgracia. La forma más fácil de lograr lo que quieres, sin implementar DividerItemDecoration aquí:
Añada el color de fondo al RecyclerView al color deseado del divisor:
<RecyclerView android:id="@+id/rvList" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="@color/colorLightGray" android:scrollbars="vertical" tools:listitem="@layout/list_item" android:background="@android:color/darker_gray"/>
Añadir margen inferior (android: layout_marginBottom) a la raíz de diseño del elemento (list_item.xml):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="1dp"> <TextView android:id="@+id/tvName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="John Doe" /> <TextView android:id="@+id/tvDescription" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/tvName" android:text="Some description blah blah" /> </RelativeLayout>
Esto debería dar espacio de 1dp entre los elementos y el color de fondo de RecyclerView (que es de color gris oscuro aparecería como divisor).
- No se encontró error de repositorio en la instalación de ADT en eclipse Indigo
- Biblioteca de diseño de Android – Problemas de relleno / margen de botón de acción flotante