没有办法使用内置的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 可绘制对象的垂直边界是根据每个子视图的底部边缘计算的。
当然,您可以创建自己的 RecyclerView.ItemDecoration 实现,并为列表中的第一项创建特殊情况。
编辑:这是一个精简和简化的ItemDecoration,它基于DividerItemDecoration,但还在第一项顶部绘制了一个分隔线:https://gist.github.com/zizibaloob/0c6be3e1318257950507e9c614c8aa70