在RecyclerView的开头添加DividerItemDecoration效果

Min*_*oru 6 android

我有一个布局,其中包含一个 TextView,布局顶部有一个辅助文本,后跟一个带有相关项目的 RecyclerView。

我向 RecyclerView 添加了一个 DividerItemDecoration,但它只划分(我知道,这就是它的名字)元素,而不是从 RecyclerView 的第一个元素划分辅助 TextView。

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

Ben*_* P. 9

使用内置类无法完成您想要的操作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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

在这里您可以看到可绘制对象的垂直边界mDivider是根据每个子视图的底部边缘计算的。

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

编辑:这是一个精简和简化的ItemDecoration,基于DividerItemDecoration但也在第一个项目的顶部绘制了一个分隔线:https://gist.github.com/zizibaloob/0c6be3e1318257950507e9c614c8aa70