How to indent the divider in a linear layout RecyclerView (ie, add padding, margin, or an inset only to the ItemDecoration)
Asked Answered
D

1

15

Following this answer I was able to get a divider between the items of a vertical RecyclerView. However, I also wanted to slightly indent the divider lines.

I was able to do it by hard coding in an INDENT value in the RecyclerView.ItemDecoration subclass.

int INDENT = 20;

@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { 

    int left = parent.getPaddingLeft() + INDENT;
    int right = parent.getWidth() - parent.getPaddingRight() - INDENT;

    // ...

        divider.setBounds(left, top, right, bottom);

    // ...
} 

However, then I would have had to also mess with density independant pixels.

I finally found a solution similar to how it was done with ListView so I am sharing that as an answer below.

Dogmatist answered 5/11, 2016 at 2:45 Comment(0)
D
66

Use inset

drawable/my_divider.xml

<inset xmlns:android="http://schemas.android.com/apk/res/android"
       android:insetLeft="40dp"
       android:insetRight="40dp" >

    <shape>
        <size android:height="1dp"/>
        <solid android:color="@color/recyclerview_divider" />
    </shape>

</inset>

Using the constructor that takes a resource id as shown in this answer, we can supply the id of our custom divider xml file.

Update:

We can't add drawable in DividerItemDecoration constructor, we need to set drawable after created like in the example below

ItemDecoration dividerItemDecoration = new DividerItemDecoration(
    getActivity(), 
    RecyclerView.VERTICAL
)
dividerItemDecoration.setDrawable(drawable)
recyclerView.addItemDecoration(decorator);

Drawable drawable =

enter image description here

Dogmatist answered 5/11, 2016 at 2:45 Comment(4)
Thanks! Definitely beats all the other convoluted answers I've seen.Tacy
I get this error "Invalid orientation. It should be either HORIZONTAL or VERTICAL" when I do thatFoulup
@ivange94, sounds like a problem with your layout manager. Check out this answer for the base code. #40584924Dogmatist
Of all the solutions I could find, this one is still superior 3 years later. A word of caution, the instantiation of the divider constructor today only allows the second parameter to be an orientation value, you have to set your custom Drawable after you instantiate via dividerItemDecorationInstance.setDrawable(drawable).Lithiasis

© 2022 - 2024 — McMap. All rights reserved.