Как отступать делитель в линейном макете RecyclerView (т.е. Добавлять отступы, поля или вставки только в ItemDecoration)

Следуя этому ответу, мне удалось получить разделитель между элементами вертикального RecyclerView. Тем не менее, я также хотел слегка отступать от разделителей.

Я смог сделать это с помощью жесткого кодирования в значении INDENT в подклассе RecyclerView.ItemDecoration.

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

    // ...
} 

Однако тогда мне пришлось бы также испортить плотность независимых пикселей.

Наконец-то я нашел решение, подобное как это было сделано с ListView, поэтому я рассказываю об этом в качестве ответа ниже.

Ответ 1

Используйте inset

вытяжка/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>

Используя конструктор, который принимает идентификатор ресурса, как показано в этом ответе, мы можем предоставить идентификатор нашего пользовательского файла XML-делителя.

recyclerView.addItemDecoration(
        new DividerItemDecoration(getActivity(), R.drawable.my_divider));

введите описание изображения здесь