资讯专栏INFORMATION COLUMN

RecycleView设置顶部分割线(记录一个坑)

TIGERB / 344人阅读

摘要:大家都知道,想给设置分割线可以重写项目过程中,遇到一个需求顶部有一条灰色的间隔,我想到了给设置分割线的方法,当然只给第一个设置,而且在上方。结果出现了一个现象,顶部分割线一直停留在顶部,不会跟着移动。

大家都知道,想给RecycleView设置分割线可以重写RecyclerView.ItemDecoration

项目过程中,遇到一个需求:RecycleView顶部有一条灰色的间隔,我想到了给RecycleView设置分割线的方法,当然只给第一个Item设置,而且在上方。

public class MyDividerItemDecoration extends RecyclerView.ItemDecoration {

    private Drawable mDivider;

    /**
     * Custom divider will be used
     */
    public MyDividerItemDecoration(Context context, int resId) {
        mDivider = ContextCompat.getDrawable(context, resId);
    }
    public DividerItemDecoration(Drawable drawable) {
mDivider = drawable;
}
  @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, 
RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); //因为绘制了顶部分割线,因此需要将第一行的item下移相应的距离
//这里要注意,判断该RecycleView是什么布局,如果是竖直方向上的线性布局(水平方向上的这里没有考虑)
//,那么需要让第一个Item下移,移动的距离是分割线的高度,因为分割线会占据Item的空间
//如果是网格布局,那么需要把第一行的所有Item都下移相应的高度
if (layoutManager instanceof LinearLayoutManager) { if (parent.getChildAdapterPosition(view) == 0) { outRect.set(0, mDivider.getIntrinsicHeight(), 0, 0); } } if (layoutManager instanceof GridLayoutManager) { if (parent.getChildAdapterPosition(view) >= 0 &&
parent.getChildAdapterPosition(view) < getSpanCount(parent)) { outRect.set(0, mDivider.getIntrinsicHeight(), 0, 0); } } } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { //绘制分割线 int left = 0; int right = parent.getWidth(); View child = parent.getChildAt(0); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); //不可以直接设置top = 0;因为这样的话分隔线就不会跟着移动,因为top = 0,是绝对位置,
//所以应该设置为子view的相对位置 //这样才可以跟着滑动。
//child的顶部坐标,减去设置的margin_top的值,再减去child为了给分割线腾出空间所下滑的高度,
//这样分割线才会在顶部
int top = child.getTop() - params.topMargin - mDivider.getIntrinsicHeight(); int bottom; bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } private int getSpanCount(RecyclerView parent) { // 列数 int spanCount = -1; RecyclerView.LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { spanCount = ((StaggeredGridLayoutManager) layoutManager) .getSpanCount(); } else if (layoutManager instanceof LinearLayoutManager) { spanCount = layoutManager.getItemCount(); } return spanCount; }

在onDrawOver方法中可以绘制分割线。

这里有一个需要注意的坑,调试了很久,最终才发现,难受。

在onDrawOver里面,一开始我设置top = 0;因为绘制在顶部嘛。结果出现了一个现象,顶部分割线一直停留在顶部,不会跟着移动。最后改为int top = child.getTop() - params.topMargin - mDivider.getIntrinsicHeight();才成功了。为什么呢?

因为直接写top = 0;这是绝对位置了,要让分割线也跟着滑动,需要用的是相对位置,相对于item的位置,这样才能够跟着item滑动

 

调用

recyclerView.addItemDecoration(new MyDividerItemDecoration(this, R.drawable.item_decoration));

item_decoration代码如下:


    
    

 

或者我们可以直接代码中创建Drawable,然后传进去:

//添加白色分割线在顶部
GradientDrawable drawable = new GradientDrawable();
drawable.setColor(ContextCompat.getColor(this, R.color.white));
drawable.setShape(GradientDrawable.RECTANGLE);
drawable.setSize(0, 3);
recyclerView.addItemDecoration(new DividerItemDecoration(drawable));

 

尊重劳动成果,转载请标明出处:https://www.cnblogs.com/tangZH/p/9489486.html 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/2830.html

相关文章

  • RecycleView 与 Elevation

    摘要:以前一直用,因为可以搞定绝大部分需求。如果只用做透明的分割线,复写就可以实现了。列表本身如果对分割线的不敏感,复写就可以。阴影是子打在父上的子必须设置父必须比子稍大一些,父不要用,在子上用属性 RecycleView 以前一直用ListView,因为ListView可以搞定绝大部分需求。最近项目UI做了很大调整,需要宽度不同的Item混排,记录一下遇到的问题。类似这样效果 showIm...

    neu 评论0 收藏0
  • Android第三方库 - 收藏集 - 掘金

    摘要:项目地址特性来啦,快来玩一玩掘金可以说是的升级版,前段时间开发的目前已经有个,的设计初衷是一个能让文本执行漂亮的漂浮动画。免调试工具掘金是一款方便调试的工具,可以兼容所有版本,不需要权限。 收藏安卓开发中非常实用优秀的库! 有图有真相! - Android - 掘金本来是打算收藏工具类的,但转念一想,已经有这么多优秀的库了,就没必要再去重复造轮子了,便归纳工作中比较实用的库吧,不用在花...

    sihai 评论0 收藏0
  • Android Studio教程11-RecycleView的使用

    摘要:目录将添加到布局主中如何调用对象重写定义实例将添加到布局此文件命名为线性布局网格布局瀑布布局主中如何调用对象的三部曲获取对象添加水平分割线如果传入则该布局支持纵向滑动,那么前面的则指的是列。目录 1. RecyclerView 1.1. Add support library 1.2. 将RecyclerView添加...

    李文鹏 评论0 收藏0
  • android各种效果库

    摘要:你被下拉刷新和上拉加载搞烦了吗下拉刷新和上拉加载的库多如牛毛,你为何还要再造一个轮子是的,这方面的库确实多到看不过来,但是却没有找到一个能够内部判断是下拉刷新还是上拉加载,处理空白页面错误页面,并且维护了的轮子。 可能是最优雅的切换布局的方法 动态切换布局控件 android 实现画板功能 本例详细分析了一个画板功能的实现过程,并讲述了图像混合和双缓冲技术的基本原理。 有关Activi...

    shaonbean 评论0 收藏0
  • 支持scrollTo的RecycleView

    摘要:内部没有帮我们实现的方法,不过帮我们实现了,我们可以通过自定义一个支持的。RecycleView内部没有帮我们实现ScrollTo的方法,不过帮我们实现了ScrollBy,我们可以通过ScrollBy自定义一个支持scrollTo的RecycleView。 public class ScrollToRecyclerView extends RecyclerView { //记录滚动...

    Yang_River 评论0 收藏0

发表评论

0条评论

TIGERB

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<