Android 最强RecyclerView分割线XRecyclerViewDivider重磅来袭!!


前言

沉浸在Android前端这几年里,接触最多的业务就是RecyclerView列表展示数据了,每次写到需要分割线时都是到网上copy,有时候一些分割线又不能满足需求,只能在布局上做文章。

虽然这样可以实现需求,但是总感觉这样写会写很多重复的代码,这边添加了View,那边又设置padding等,所以这一个月来利用工作空闲时间写了这个XRecyclerViewDivider,希望可以帮助大家吧!


一、分割线绘制原理

我们先看看谷歌提供给我们的分割线DividerItemDecoration,它主要实现了RecyclerView.ItemDecoration中的两个方法:onDraw()和getItemOffsets()。那这两个方法有什么用呢?

网上也有挺多文章分析了RecyclerView分割线绘制的原理,其中这篇文章写得真不错RecyclerView 之 ItemDecoration 讲解及高级特性实践,简单来说,getItemOffsets()方法负责为每个item设置间距,即分割线,而onDraw()负责draw这些间距的样式。


二、XRecyclerViewDivider的功能

回到我们的库,我称之为RecyclerView分割线,必然是对其主要的三个LayoutManager提供支持的,不做特别说明,以下的都可兼容横向LayoutManager。

我们采用建造者模式去设置分割线相关属性:

  • LinearLayoutManager的分割线对应XLinearBuilder
  • GridLayoutManager的分割线对应XGridBuilder
  • StaggeredGridLayoutManager的分割线对应XStaggeredGridBuilder
recyclerView.addItemDecoration("对应的Builer");

1.LinearLayoutManager

  • 支持水平竖直方向LayoutManager
  • 支持设置第一个item 上边距
  • 支持设置最后一个item的分割线
  • 支持space大小、分割线padding、分割线是否绘制到RecyclerView的padding
  • 支持设置分割线color、drawable
  • 支持设置不显示哪些item分割线
  • 支持定制某个item的分割线(包括padding、color、drawable、设置边界等)

XLinearBuilder属性表格

属性意义
mSpacing分割线间距,默认1dp;可直接设置dp或dp对应的res
mShowLastLine是否绘制最后一个item的分割线,默认false
mShowFirstTopLine是否绘制第一个item上边或左边分割线,默认false
mIsIncludeParentLTPadding分割线是否绘制RecyclerView的左或上padding部分,默认false
mIsIncludeParentRBPadding分割线是否绘制RecyclerView的右或下padding部分,默认false
mLeftPadding | mTopPadding分割线左边距或上边距
mRightPadding | mBottomPadding分割线右边距或下边距
mColor分割线的颜色
mDividerDrawable分割线的drawable
mOnNoDividerPositionposition分割线不绘制的回调,返回position的数组,为null不处理
mOnItemDivider定制某条分割线的回调,返回的是LDecoration,为null不处理

LDecoration主要是设置某条分割线的属性,如果设置了setPadding方法,则会把mLeftPadding、mTopPadding、mRightPadding、mBottomPadding设置,设置了mDividerDrawable会覆盖mColor,具体可看源码。

效果图:

图一
图二

基本使用1(图一):


        new XLinearBuilder(this)
                //分割线间距,支持float dp 和DimenRes dp
                .setSpacing(4f)
                .setShowFirstTopLine(true)
                .setShowLastLine(true)
                .setColor(Color.BLACK)
                //设置哪几个position不绘制分割线,接受数组new int[]{0,1},返回null表示不处理
                .setOnItemNoDivider(() -> null)
                //定制某一item分割线样式,可改颜色和设置边沿分割线,返回null表示不处理
                .setOnItemDividerDecoration(new XLinearBuilder.OnItemDivider() {
                    @Override
                    public LDecoration getItemDividerDecoration(int position) {
                        if (position == 1) {
                            return new LDecoration(LinearActivity.this)
                                    .setColor(Color.RED);

                        }
                        return null;
                    }
                })
        ;

基本使用2(图二):


        new XLinearBuilder(this)
                //分割线间距,支持float dp 和DimenRes dp
                .setSpacing(4f)
                .setShowFirstTopLine(true)
                .setShowLastLine(true)
                .setColor(Color.BLACK)
                //设置哪几个position不绘制分割线,接受数组new int[]{0,1},返回null表示不处理
                .setOnItemNoDivider(() -> null)
                //定制某一item分割线样式,可改颜色和设置边沿分割线,返回null表示不处理
                .setOnItemDividerDecoration(new XLinearBuilder.OnItemDivider() {
                    @Override
                    public LDecoration getItemDividerDecoration(int position) {
                        return new LDecoration(LinearActivity.this)
                                .setAroundEdge(true, null, true, null)
                                .setColor(Color.RED);


                    }
                });
                

这里只是简单的介绍了几个属性和展示效果,更多属性的设置和水平方向的设置可自行下载demo去设置不一样的属性。

2.GridLayoutManager

  • 支持水平竖直方向GridLayoutManager
  • 支持设置是否显示边界
  • 可分别设置水平方向和竖直方向的space、color、drawable等
  • 支持SpanSizeLookup(不规则的Grid)
  • 支持设置横竖交叉处的归属(属于竖向或横向)

XGridBuilder属性表格

属性意义
mSpacing分割线间距,默认0dp;可直接设置dp或dp对应的res
mVLineSpacing竖直线的间距,默认0dp,会覆盖mSpacing
mHLineSpacing水平线的间距,默认0dp,会覆盖mSpacing
mIsIncludeEdge是否绘制边界,默认false
mVerticalIncludeEdge分割线交叉处是否属于竖直线的部分,默认false
mVLineColor竖直分割线颜色
mHLineColor水平分割线颜色
mColor分割线的颜色,会被mVLineColor或mHLineColor覆盖
mVLineDividerDrawable竖直分割线的drawable
mHLineDividerDrawable水平分割线的drawable
mDividerDrawable分割线的drawable,会被mVLineDividerDrawable或mHLineDividerDrawable覆盖

效果图:

图三
图四
图五
图六

图三、图四和图五、图六主要是是否包括边界和LayoutManager方向不同,使用Builder构造分割线时不需要考虑LayoutManager的方向,我们只管设置自己想要的属性即可,属性代表的意义参照上表。

基本使用:


        new XGridBuilder(this)
                //分割线间距,支持float dp 和DimenRes dp
                .setSpacing(2f)//这几个Spacing的优先级可看XGridBuilder说明
                .setVLineSpacing(4f)
                .setHLineSpacing(8f)
                //这几个color和drawable的优先级可看XGridBuilder说明
                .setColor(Color.BLUE)
                //可设置颜色和drawable,drawable>color
//                .setColorRes(R.color.white)
//                .setDrawable(new ColorDrawable(Color.WHITE))
//                .setDrawableRes(R.drawable.)
                .setHLineColor(Color.BLACK)
//                .setHLineDrawable()
                .setVLineColor(Color.RED)
//                .setVLineDrawable()
                //是否包括边界
                .setIncludeEdge(true)
                //竖直和水平分割线交叉处绘制的是竖直分割线颜色(交叉处属于竖直分割线)
                .setVerticalIncludeEdge(true)
                ;
                

3.StaggeredGridLayoutManager

  • 支持水平竖直方向StaggeredGridLayoutManager
  • 支持设置是否显示边界
  • 可设置水平方向和竖直方向的space、不支持color、drawable(基本不用)
  • 支持设置FullSpan情况

XStaggeredGridBuilder属性表格

属性意义
mSpacing分割线间距,默认0dp;可直接设置dp或dp对应的res
mVLineSpacing竖直线的间距,默认0dp,会覆盖mSpacing
mHLineSpacing水平线的间距,默认0dp,会覆盖mSpacing
mIsIncludeEdge是否绘制边界,默认false
mIsIgnoreFullSpan边界绘制是否忽略FullSpan的情况,默认false

效果图:

图七
图八

基本使用:


        new XStaggeredGridBuilder(this)
                //分割线间距,支持float dp 和DimenRes dp
                .setSpacing(2f)//这几个Spacing的优先级可看XGridBuilder说明
                .setVLineSpacing(4f)
                .setHLineSpacing(8f)
                //是否包括边界
                .setIncludeEdge(true)
                //是否忽略FullSpan的情况
                .setIgnoreFullSpan(true)
                ;
                

相比上面两个LayoutManager,瀑布流布局分割线就显得很简单了,基本没有color、drawable的定制需求,所以就没有实现,其实它和网格布局差不多,如果有这些需求可参考下网格分割线color、drawable的设置。

感谢:ByRecyclerView,采纳了其对FullSpan处理的一些思想。


三、项目引入该库

在你的 Project build.gradle文件中添加:

allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}

在你的 Module build.gradle文件中添加:

dependencies {
	        implementation 'com.github.HHotHeart:XRecyclerViewDivider:1.0.1'
	}

总结

XRecyclerViewDivider分割线的基本介绍就到这了,使用中有问题或没有实现的功能都可以反馈给我,我一定会尽量满足大家的需求。希望这个库能够帮到大家,附上GitHub传送门,欢迎star~。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
RecyclerView分割线可以通过设置ItemDecoration来实现。下面是一个示例代码: 首先,创建一个分割线的类,继承自RecyclerView.ItemDecoration: ```java public class DividerItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; public DividerItemDecoration(Context context) { // 获取系统默认的分割线Drawable TypedArray styledAttributes = context.obtainStyledAttributes(new int[]{android.R.attr.listDivider}); mDivider = styledAttributes.getDrawable(0); styledAttributes.recycle(); } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int top = child.getBottom() + params.bottomMargin; int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } } ``` 然后,在使用RecyclerView的地方,添加分割线: ```java RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.addItemDecoration(new DividerItemDecoration(this)); ``` 这样就可以在RecyclerView的每个Item之间添加一个默认的分割线了。如果需要自定义分割线的样式,可以修改DividerItemDecoration类中的绘制逻辑或者使用其他Drawable替代mDivider

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄小梁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值