【问题标题】:Add DividerItemDecoration effect in the begining of RecyclerView在 RecyclerView 开头添加 DividerItemDecoration 效果
【发布时间】:2017-12-12 17:16:02
【问题描述】:

我有一个布局,它由 TextView 和布局顶部的帮助文本组成,然后是 RecyclerView 和相关项目。

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

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

【问题讨论】:

    标签: android


    【解决方案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 可绘制对象的垂直边界是根据每个子视图的底部边缘计算的。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-12-09
        • 1970-01-01
        • 1970-01-01
        • 2015-09-05
        • 1970-01-01
        • 2015-09-04
        • 1970-01-01
        • 2015-09-25
        • 1970-01-01
        相关资源
        最近更新 更多