¿Cómo se puede agregar una línea divisoria en un dispositivo Android RecyclerView?

Estoy desarrollando una aplicación de Android donde estoy usando RecyclerView . Necesito agregar un divisor en RecyclerView . Traté de agregar –

 recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST)); 

a continuación está mi código xml –

   

La forma correcta es definir ItemDecoration para RecyclerView siguiente manera

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:

      

Por último, configúralo así

 recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this)); 

Editar

Como señala @Alan Solitar

 context.getResources().getDrawable(R.drawable.line_divider); 

se deprecia en lugar de eso se puede usar

 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 predeterminada de divisores horizontales y verticales básicos disponibles!

https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html

  recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL)); 

Si desea tener divisores horizontales y verticales:

  1. Definir estructuras divisibles horizontales y verticales:

    horizontal_divider.xml

          

    vertical_divider.xml

          
  2. Agregue 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); 

Simplemente agregue una vista al final de su adaptador de elementos:

  

Todas estas respuestas me acercaron, pero a cada una le 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 la biblioteca de soporte DividerItemDecoration
  2. Crea un divisor con el color correcto
  3. Establezca este divisor en su tema como el listDivider

Paso 1: al configurar RecyclerView

 recyclerView.addItemDecoration( new DividerItemDecoration(context, layoutManager.getOrientation())); 

Paso 2: en un archivo como res / drawable / divider_gray.xml

      

Paso 3: en el tema de la aplicación

  

EDITAR: 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, lo cual era molesto. Así que modifiqué el Paso 1 de la siguiente manera para anular ese comportamiento predeterminado en DividerItemDecoration (por supuesto, hacer una clase separada es 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); } } } ); 

Aquí está el código para un divisor personalizado simple (divisor vertical / altura 1dp / negro):

Supongo que tiene Support Library:

 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); 

luego, el ejemplo del archivo custom_divider.xml:

      

Creo que estás usando Fragments para tener RecyclerView

Simplemente agregue estas líneas después de crear sus objetos RecyclerView y LayoutManager

 DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL); recyclerView.addItemDecoration(dividerItemDecoration); 

¡Eso es!

Admite orientaciones HORIZONTALES y VERTICALES.

Crea un archivo xml separado en la carpeta res / dibujable

       

Conecte ese archivo xml (su_archivo) a la actividad principal , como este:

 DividerItemDecoration divider = new DividerItemDecoration( recyclerView.getContext(), DividerItemDecoration.VERTICAL ); divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.your_file)); recyclerView.addItemDecoration(divider); 

Así que esta podría no ser la manera correcta, pero acabo de agregar una vista a la vista de elemento único de la vista de reciclador (ya que no creo que haya una función incorporada) como esta:

  

Esto significa que cada elemento tendrá una línea que lo llene en su parte inferior. Lo hice aproximadamente 1dp de alto con un fondo # 111111. Esto también le da una especie de efecto “3D”.

Necesitas agregar la siguiente línea …

 mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL)); 

Puede crear un divisor reutilizable simple.

Crear divisor:

 public class DividerItemDecorator extends RecyclerView.ItemDecoration { private Drawable mDivider; public DividerItemDecorator(Drawable divider) { mDivider = divider; } @Override public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { int dividerLeft = parent.getPaddingLeft(); int dividerRight = 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 dividerTop = child.getBottom() + params.bottomMargin; int dividerBottom = dividerTop + mDivider.getIntrinsicHeight(); mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom); mDivider.draw(canvas); } } } 

Crear Divider Line: divider.xml

      

Agregue divisor a su Recyclerview:

 RecyclerView.ItemDecoration dividerItemDecoration = new DividerItemDecorator(ContextCompat.getDrawable(context, R.drawable.divider)); recyclerView.addItemDecoration(dividerItemDecoration); 

Para eliminar el divisor del último artículo:

Para evitar que el divisor dibuje para el último artículo, debe cambiar esta línea.

 for (int i = 0; i < childCount; i++) 

A

 for (int i = 0; i < childCount-1; i++) 

Su implementación final debería ser así:

 public class DividerItemDecorator extends RecyclerView.ItemDecoration { private Drawable mDivider; public DividerItemDecorator(Drawable divider) { mDivider = divider; } @Override public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { int dividerLeft = parent.getPaddingLeft(); int dividerRight = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount - 1; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int dividerTop = child.getBottom() + params.bottomMargin; int dividerBottom = dividerTop + mDivider.getIntrinsicHeight(); mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom); mDivider.draw(canvas); } } } 

Espero eso ayude:)

El RecyclerView-FlexibleDivider de yqritc hace que este sea un trazador de líneas único. Primero agrega esto a tu build.gradle :

 compile 'com.yqritc:recyclerview-flexibledivider:1.4.0' // requires jcenter() 

Ahora puede configurar y agregar un divisor donde configure el adaptador de su 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()); 

Prueba este sencillo código de una sola línea

recyclerView.addItemDecoration(new DividerItemDecoration(getContext(),LinearLayoutManager.VERTICAL));

Para hacer que la respuesta de NJ sea un poco más simple, puede hacer lo siguiente:

 public class DividerColorItemDecoration extends DividerItemDecoration { public DividerColorItemDecoration(Context context, int orientation) { super(context, orientation); setDrawable(ContextCompat.getDrawable(context, R.drawable.line_divider)); } } 

Android simplemente hace las cosas muy complicadas, desafortunadamente. La forma más sencilla de lograr lo que desea, sin implementar DividerItemDecoration aquí:

Agregue color de fondo al RecyclerView al color del divisor deseado:

  

Añada margen inferior (android: layout_marginBottom) a la raíz de diseño del elemento (list_item.xml):

     

Esto debería dar un espacio de 1dp entre los elementos y el color de fondo de RecyclerView (que es de color gris oscuro aparecería como divisor).

Simplemente agregue un margen de x cantidad en la parte inferior de un elemento en su RecycleView Adapter .

onCreateViewHolder

 LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); layoutParams.setMargins(0, 0, 0, 5); itemView.setLayoutParams(layoutParams); 
 recyclerview.addItemDecoration(new DividerItemDecoration(this, 0)); 

Donde 0 es horizontal y 1 es verídico