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