【问题标题】:eliminate divider on top of the first item in the RecyclerView消除 RecyclerView 中第一项顶部的分隔线
【发布时间】:2019-06-07 05:05:37
【问题描述】:

我有一个顶部有标题的RecyclerView(即一个标题,一个描述RecyclerView内容的TextView

现在我把两个不同的ViewHolder和一些逻辑组合到Adapter里面来得到这个效果,结果却出乎意料。

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

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

这个post 展示了如何消除 RV 的最后一行分隔符,但我需要第一行,我不知道如何使这个 sn-p 适应我的用例,或者我是否应该创建一个新课程。

【问题讨论】:

  • 能否附上SS或代码进一步说明?

标签: android android-layout android-recyclerview android-adapter ondraw


【解决方案1】:

RecyclerView.ItemDecoration 中,我想识别RecyclerView 中的第一个视图,而不是为其绘制装饰。我也不想为装饰保留任何空间,因为它没有被绘制。这需要覆盖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);  
            }  
        }  
    }  
}

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

【讨论】:

  • 谢谢,但我可以从Adapter 拨打DividerItemDecorator 吗?我实时将三个不同的recycler视图状态更改为适配器。所以我不能从活动视图中调用Recyclerview.ItemDecoration。无论如何,我之前必须指定这一点。我会接受你的回复
  • @Drocchio 您可以在适配器中设置ItemDecoration。可能最好的地方是onAttachedToRecyclerView()。该回调在任何布局之前调用。
猜你喜欢
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多