目录

  • 前言
  • 一、分割线绘制原理
  • 二、XRecyclerViewDivider的功能
    • 1.LinearLayoutManager
    • 2.GridLayoutManager
    • 3.StaggeredGridLayoutManager
  • 三、项目引入该库
  • 总结


前言

沉浸在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.0'}

总结

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

更多相关文章

  1. Unity与Android权限设置
  2. 教你如何开关Android的APN网络
  3. Android精讲--界面编程3
  4. Android(安卓)Permission大全
  5. Eclipse build Android时不生成apk问题解决方法
  6. Android(安卓)Develop Tips
  7. Android混合开发
  8. Android(安卓)Permission大全
  9. 【Android布局】在程序中设置android:gravity 和 android:layout

随机推荐

  1. Android后台杀死系列之三:LowMemoryKiller
  2. Android中C/C++的日志打印
  3. Android上的Back键事件捕获
  4. 浅析Android线程模型
  5. 【Android(安卓)笔记 五】 Android(安卓)
  6. Android风格设计(style)
  7. Android中的Menu点滴记录
  8. 2017 年 Android(安卓)领域大事件回顾
  9. 杂谈:2012年Android的发展状况
  10. Android源码 半小时下完Android系统源码