消除 RecyclerView 中第一项顶部的分隔符

eliminate divider on top of the first item in the RecyclerView

我有一个RecyclerView,上面有一个header(即标题,一个描述RecyclerView内容的TextView

现在我通过一些逻辑将两个不同的ViewHolders组合到Adapter中来获得这个效果,但是我得到了意想不到的结果。

recyclerView 有分隔线,但是 我想在 TextView 和 `RecyclerView 的第一个项目之间删除一行:

换句话说,我只需要消除 RecyclerView 的顶部分隔线, 第一项,因为我希望顶部的 TextView 和下面的列表之间没有分隔,而我希望其他项在我获得时分开

展示了如何消除 RV 的最后一行分隔符,但我需要第一行,但我不知道如何根据我的用例调整此代码段,或者我是否应该创建一个新的 class.

RecyclerView.ItemDecoration 中我想识别 RecyclerView 中的第一个视图而不是为其绘制装饰。我也不想为装饰保留任何 space,因为它没有被绘制。这需要覆盖 getItemOffsets()

下面是一些代码,它对除第一个和最后一个之外的所有 RecyclerView 项的底部应用装饰。

    public class DividerItemDecorator extends RecyclerView.ItemDecoration {  
    private Drawable mDivider;  

    public DividerItemDecorator(Drawable divider) {  
        mDivider = divider;  
    }  

    @Override  
  public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {  
        int pos = parent.getChildAdapterPosition(view);  
        if (pos != 0 &&  
            pos != parent.getLayoutManager().getItemCount() - 1) {  
            outRect.bottom = mDivider.getIntrinsicHeight();  
        }  
    }  

    @Override  
  public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {  
        int dividerLeft = parent.getPaddingLeft();  
        int dividerRight = parent.getWidth() - parent.getPaddingRight();  

        int childCount = parent.getChildCount();  
        for (int i = 0; i < childCount; i++) {  
            View child = parent.getChildAt(i);  

            int pos = parent.getChildAdapterPosition(child);  
            if (pos != 0 &&  
                pos != parent.getLayoutManager().getItemCount() - 1) {  

                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();  

                int dividerTop = child.getBottom() + params.bottomMargin;  
                int dividerBottom = dividerTop + mDivider.getIntrinsicHeight();  
                mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom);  
                mDivider.draw(canvas);  
            }  
        }  
    }  
}

这是它的样子。我夸大了分隔线,以便它们脱颖而出。