繁体   English   中英

在RecyclerView的开头添加DividerItemDecoration效果

[英]Add DividerItemDecoration effect in the begining of RecyclerView

我有一个布局,该布局包含一个TextView和一个带有相关项目的RecyclerView,该TextView在布局的顶部带有辅助文本。

我在RecyclerView中添加了DividerItemDecoration,但它仅对元素进行划分(我知道,这就是它的名字),但不对RecyclerView的第一个元素进行辅助TextView。

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

使用内置的DividerItemDecoration类无法执行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实现,并为列表中的第一项创建特殊情况。

编辑 :这是一个基于DividerItemDecoration简化精简ItemDecoration ,但还在第一个项目的顶部绘制了分隔线: https : DividerItemDecoration

您可以在XML中使用View来划分recyclerView和TextView,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM