How can a divider line be added in an Android RecyclerView? How can a divider line be added in an Android RecyclerView? android android

How can a divider line be added in an Android RecyclerView?


In the October 2016 update, the support library v25.0.0 now has a default implementation of basic horizontal and vertical dividers available!

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

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


The Right way is to define ItemDecoration for the RecyclerView is as following

SimpleDividerItemDecoration.java

public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration {    private Drawable mDivider;     public SimpleDividerItemDecoration(Context context) {        mDivider = ContextCompat.getDrawable(context, 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);        }    }}

Or If you are using kotlin:SimpleDividerItemDecoration.kt

class SimpleDividerItemDecoration(context: Context, @DrawableRes dividerRes: Int) : ItemDecoration() {    private val mDivider: Drawable = ContextCompat.getDrawable(context, dividerRes)!!    override fun onDrawOver(c: Canvas, parent: RecyclerView) {        val left = parent.paddingLeft        val right = parent.width - parent.paddingRight        val childCount = parent.childCount        for (i in 0 until childCount) {            val child: View = parent.getChildAt(i)            val params = child.layoutParams as RecyclerView.LayoutParams            val top: Int = child.bottom + params.bottomMargin            val bottom = top + mDivider.intrinsicHeight            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>

Finally set it like this

recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));

Edit

As pointed by @Alan Solitar

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

is depreciated instead of that you can use

ContextCompat.getDrawable(context,R.drawable.line_divider);


If you want to have both horizontal and vertical dividers:

  1. Define horizontal & vertical divider drawables:

    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. Add this code segment below:

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