如何在线性布局的RecyclerView中缩进分隔符(即仅向ItemDecoration添加填充、边距或插图)

15

根据这个答案,我成功地在垂直的RecyclerView项之间设置了分隔线。但是,我还想稍微缩进分隔线。

我通过在RecyclerView.ItemDecoration子类中硬编码一个INDENT值来实现它。

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个回答

66

使用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>
使用以资源ID作为参数的构造函数,就像这个答案中所示,我们可以提供自定义分隔线xml文件的ID。 更新: 我们不能在DividerItemDecoration构造函数中添加drawable,我们需要像下面的示例一样在创建后设置drawable。
ItemDecoration dividerItemDecoration = new DividerItemDecoration(
    getActivity(), 
    RecyclerView.VERTICAL
)
dividerItemDecoration.setDrawable(drawable)
recyclerView.addItemDecoration(decorator);

可绘制对象drawable =

在此输入图片描述


3
谢谢!绝对比我看到的所有复杂答案都要好。 - Bamerza
4
当我这样做时,出现了“无效方向。它应该是水平或垂直之一”的错误提示。 - Stylishcoder
@ivange94,似乎是您的布局管理器出了问题。查看此答案以获取基础代码。https://dev59.com/8VkR5IYBdhLWcg3w9RoO#40584425 - Suragch
12
在我能找到的所有解决方案中,这一个仍然是3年后最优秀的。需要注意的是,分隔符构造函数实例今天只允许第二个参数为方向值,在通过 dividerItemDecorationInstance.setDrawable(drawable) 实例化后,您必须设置自定义的可绘制对象。 - Shadow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接