目录
前言
沉浸在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 |
mOnNoDividerPosition | position分割线不绘制的回调,返回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~。