recyclerview 分割线_ByRecyclerView:真万能分割线 (线性/宫格/瀑布流)

34002f19870b0f724874c411bba0d788.png

作者:Jinbeen 链接:https://www.jianshu.com/p/dbb81c829e53


前言

我基本上找遍了网上所有通过ItemDecoration设置分隔线的文章,但都不尽如意,它们大多只适用于部分情况,比如只能给线性布局设置、只能设置color不能设置drawable、不能去除HeaderView部分的分割线、配置麻烦等等等。

于是我费尽周折出了两个类:SpacesItemDecorationGridSpaceItemDecoration。它们基本解决了上述所有问题!

收录于开源项目:ByRecyclerView

它们有什么功能

SpacesItemDecoration

LinearLayoutManager设置

  • 1、可设置colordrawable
  • 2、可设置分割线左右或上下的间距
  • 3、可设置headerfooter不显示分割线的个数,功能似ListViewsetHeaderDividersEnabled(ture)
  • 4、支持横向或纵向

GridSpaceItemDecoration

GridLayoutManagerStaggeredGridLayoutManager设置

  • 1、可配置只在四周是否显示分割线
  • 2、可设置headerfooter不显示分割线的个数
绘制原理

网上很多解释通过ItemDecoration绘制分割线的原理的文章,我简单总结一下,在getItemOffsets()方法里设置item宽度的偏移量,在onDraw()方法里主要绘制分割线颜色。getItemOffsets 是针对每一个 ItemView,而 onDraw 方法却是针对 RecyclerView 本身,所以在 onDraw 方法中需要遍历屏幕上可见的 ItemView,分别获取它们的位置信息,然后分别的绘制对应的分割线。-- 参考:https://juejin.im/post/5cecef7d5188250b3a1b9173

示例图

2c291b5ae1dbf274d31542e61bf2828d.png

518cd3cf988587011a49df60a2bf8aa5.png

参数配置

SpacesItemDecoration构造方法有四个:

SpacesItemDecoration(Context context)
SpacesItemDecoration(Context context, int orientation)
SpacesItemDecoration(Context context, int orientation, int headerNoShowSize)
/**
* @param context Current context, it will be used to access resources.
* @param orientation 水平方向or垂直方向,默认SpacesItemDecoration.VERTICAL
* @param headerNoShowSize 不显示分割线的item个数 这里应该包含刷新头
* @param footerNoShowSize 尾部 不显示分割线的item个数 默认不显示最后一个item的分割线
*/
public SpacesItemDecoration(Context context, int orientation, int headerNoShowSize, int footerNoShowSize)

其他参数设置,其中setDrawable与setParam只能选择其一:

/**
* Sets the { @link Drawable} for this divider.
*
* @param drawable Drawable that should be used as a divider.
*/
public SpacesItemDecoration setDrawable(Drawable drawable)/**
* 直接设置分割线颜色等,不设置drawable
*
* @param dividerColor 分割线颜色
* @param dividerSpacing 分割线间距
* @param leftTopPaddingDp 如果是横向 - 左边距
* 如果是纵向 - 上边距
* @param rightBottomPaddingDp 如果是横向 - 右边距
* 如果是纵向 - 下边距
*/public SpacesItemDecoration setParam(int dividerColor, int dividerSpacing, float leftTopPaddingDp, float rightBottomPaddingDp)

一个完整的设置如下:

// 设置分割线color
SpacesItemDecoration itemDecoration = new SpacesItemDecoration(recyclerView.getContext(), SpacesItemDecoration.VERTICAL, 0, 1)
.setParam(R.color.colorLine, 1, 12, 12);
recyclerView.addItemDecoration(itemDecoration);

// 设置分割线drawable
SpacesItemDecoration itemDecoration = new SpacesItemDecoration(recyclerView.getContext(), SpacesItemDecoration.VERTICAL, 0, 1)
.setDrawable(R.drawable.shape_line);
recyclerView.addItemDecoration(itemDecoration);
核心代码

这里主要解释这几个参数配置的核心代码,具体请直接见源代码:

for (int i = 0; i < childCount; i++) {
    
final View child = parent.getChildAt(i);
final int childRealPosition = parent.getChildAdapterPosition(child);

// 过滤到头部不显示的分割线
if (childRealPosition < mHeaderNoShowSize) {
continue;
}
// 过滤到尾部不显示的分割线
if (childRealPosition <= lastPosition - mFooterNoShowSize) {

// 设置drawable
if (mDivider != null) {
parent.getDecoratedBoundsWithMargins(child, mBounds);
final int bottom = mBounds.bottom + Math.round(child.getTranslationY());
final int top = bottom - mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(canvas);
}

// 设置color
if (mPaint != null) {
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
// 首尾间距
int left1 = left + mLeftTopPadding;
int right1 = right - mRightBotto
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值