当前位置: 首页 > 知识库问答 >
问题:

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

魏俊茂
2023-03-14

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

现在,我将两个不同的 ViewHolder 和一些逻辑组合到适配器中以获得此效果,但是我有一个意外的结果。

recyclerView必须有分隔符,但我想在<code>文本视图

换句话说,我只需要消除<code>RecyclerView</code>的顶部分隔符,即第一项,因为我希望顶部的TextView和下面的列表之间没有分隔,相反,我希望其他项会像我获得的那样分隔开

这篇文章展示了如何消除RV的最后一行分隔符,但我需要第一行,我不知道如何将此片段适应我的用例,或者我是否应该创建一个新类。


共有1个答案

李宁
2023-03-14
匿名用户

在< code > RecyclerView视图中。ItemDecoration我希望识别< code > recycle view 中的第一个视图,并且不为它绘制装饰。我也不想为装饰预留任何空间,因为它没有画出来。这需要重写< code>getItemOffsets()。

下面的代码将修饰应用于所有< code > recycle view 项的底部,第一项和最后一项除外。

    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);  
            }  
        }  
    }  
}

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

 类似资料:
  • 有没有办法防止分割器显示在最后一个项目之后?

  • 我想显示一个项目列表,并使用“.” 我对此进行了研究,发现RecyclerView有一个内置的ItemDecoration功能。然而,我只能找到如何画一条线: 从我所看到的,您必须为此使用可绘制的,并且隐藏最后一个分隔符仍然不是很方便。 我发现的另一个选项是在RecyclerView的适配器内创建异构布局:https://guides.codepath.com/android/Heterogeno

  • 我尝试在我的GridLayout RecyclerView中添加水平分隔线。但出于某种原因,分割线没有出现。 作为替代方法,我使用具有 2 个参数的 addItemDecoration 方法,其中第二个参数是索引,之后添加 ItemDecoration。 它强制关闭,但有以下例外: 这个尺寸意味着什么?为什么是零? 可能是因为我在活动而不是片段中使用此回收器视图吗? P、 美国:适配器没有问题;它

  • 问题内容: 这是我的onCreate,它处理适配器,LinearLayoutManager等。我尝试了每个选项以尝试将其滚动到顶部,但不能。我什至尝试创建自己的自定义LinearLayoutManager。 问题答案: 您尝试过还是? RecyclerView不会在其中实现任何滚动逻辑,而是更加具体,它会根据实现的布局转到特定的索引,在您的情况下是线性的。

  • 我想在Android系统上创建一个组之间有分隔符的菜单(菜单内)。我已经为每个组使用了不同的ID,它工作得很好。 像这样的东西: 请注意,表示组之间的分隔符。 但我想要以下菜单: 因此,我试图实现一个组,在菜单顶部有一个隐藏项,但运气不佳,因为它不显示任何内容。 我还尝试过在菜单顶部添加一个带有“假”文本的组。这样地: 但现在菜单显示为空白,而不是仅显示分隔符: 那么,我怎样才能在菜单顶部以正确的

  • 我想得到下图所示的除法器: 我希望所有列的宽度相同,但行间距不同。现在我的第一列和最后一列被剪成这样: 以下是我的< code>ItemDecoration: 我怎样才能解决这个问题?谢谢