¿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 –

  <android.support.v7.widget.RecyclerView android:id="@+id/drawerList" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" /> 

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:

  1. 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> 
  2. 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:

  1. Utilice DividerItemDecoration de la biblioteca de soporte
  2. Crear un divisor con el color correcto
  3. 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).

  • NotifyDataSetChanged- RecyclerView -¿Es una llamada asincrónica?
  • Cómo hacer un indicador de página para reciclaje horizontal
  • Clic en el elemento programáticamente en RecyclerView
  • ItemDecoration sobreescribir getItemOffsets () y animación
  • ¿Por qué ListView y RecyclerView son focusableInTouchMode?
  • Ordenar los elementos de una visita de reciclaje mediante arrastrar y soltar
  • RecyclerView no respeta la traducción al reciclar las vistas
  • Agregue RecyclerView (RecyclerFragment) a un cuadro de diálogo
  • CardView dentro de RecyclerView tiene márgenes adicionales
  • ¿Cómo utilizo un GridLayoutAnimation en un RecyclerView?
  • GridLayoutManager - el ancho de la columna envuelve a su propio hijo mayor
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.