在RecyclerView的开头添加DividerItemDecoration效果

时间:2017-12-12 17:16:02

标签: android

我的布局包含一个TextView,在布局顶部有一个帮助文本,后跟一个包含相关项的RecyclerView。

我在RecyclerView中添加了一个DividerItemDecoration,但它只划分(我知道,这就是它的名字)元素,而不是来自RecyclerView的第一个元素的帮助器TextView。

有没有办法以任何方式扩展DividerItemDecoration,或者我需要在TextView和RecyclerView之间放置一个带有背景的空View元素?

2 个答案:

答案 0 :(得分:1)

使用内置DividerItemDecoration类无法执行您想要的操作。

分隔符分两步绘制。首先,getItemOffsets()用于向RecyclerView中每个项目的底部添加空格。然后,onDraw()用于在该空间内绘制分隔符。

查看源代码:

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
        RecyclerView.State state) {
    ...
    if (mOrientation == VERTICAL) {
        outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
    } else {
        outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
    }
}

在这里,您可以看到空间仅添加到每个项目的底部(或右侧,水平模式)。第一项也没有特殊情况可以给它一个顶部偏移量。

private void drawVertical(Canvas canvas, RecyclerView parent) {
    ...
    final int childCount = parent.getChildCount();
    for (int i = 0; i < childCount; i++) {
        final View child = parent.getChildAt(i);
        parent.getDecoratedBoundsWithMargins(child, mBounds);
        final int bottom = mBounds.bottom + Math.round(child.getTranslationY());
        final int top = bottom - mDivider.getIntrinsicHeight();
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(canvas);
    }
    ...
}

在这里,您可以看到mDivider drawable的垂直边界是根据每个子视图的下边缘计算的。

当然,您可以创建自己的RecyclerView.ItemDecoration实现,并为列表中的第一项创建一个特殊情况。

修改:这是一个基于ItemDecoration的精简版DividerItemDecoration,但也会在第一个项目的顶部绘制一个分隔符:https://gist.github.com/zizibaloob/0c6be3e1318257950507e9c614c8aa70

答案 1 :(得分:0)

您可以使用xml中的View来分割recyclelerView和TextView,如下所示:

<View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/colorPrimary" />