// 设置水平分割线

rv.setLayoutManager(new LinearLayoutManager(cxt));

rv.addItemDecoration(new GridItemDecoration(1, 0, cxt.getResources().getColor(R.color.gray_dim), true));

// 设置3列网格分割线

recyclerView.setLayoutManager(new GridLayoutManager(context, 3));

recyclerView.addItemDecoration(new GridItemDecoration(1, 1, mAct.getResources().getColor(R.color.gray_dim), true));

public class GridItemDecoration extends RecyclerView.ItemDecoration

{

private int mHorizonLineWidth;

private int mVerticalLineWidth;

private Drawable mDividerDrawable;

private boolean isDrawLastLine;

/**

* 构造分割线

*

* @param horizonLineWidth 水平分割线宽

* @param verticalLineWidth 垂直分割线宽

* @param dividerColor 分割线颜色

* @param isDrawLastLine 是否绘制最后一行分割线

*/

public GridItemDecoration(int horizonLineWidth, int verticalLineWidth, int dividerColor, boolean isDrawLastLine)

{

this.mHorizonLineWidth = horizonLineWidth;

this.mVerticalLineWidth = verticalLineWidth;

this.isDrawLastLine = isDrawLastLine;

this.mDividerDrawable = new ColorDrawable(dividerColor);

}

@Override

public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state)

{

// drawHorizontal

int childCount = parent.getChildCount();

for (int i = 0; i < childCount; i++)

{

View child = parent.getChildAt(i);

if (!isDrawLastLine && isLastRaw(parent, i, getSpanCount(parent), childCount))

continue;

RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

final int left = child.getLeft() - params.leftMargin;

final int right = child.getRight() + params.rightMargin;

final int top = child.getBottom() + params.bottomMargin;

final int bottom = top + mHorizonLineWidth;

mDividerDrawable.setBounds(left, top, right, bottom);

mDividerDrawable.draw(c);

}

// drawVertical

int childCount1 = parent.getChildCount();

for (int i = 0; i < childCount1; i++)

{

final View child = parent.getChildAt(i);

if ((parent.getChildViewHolder(child).getAdapterPosition() + 1) % getSpanCount(parent) == 0)

continue;

final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

final int top = child.getTop() - params.topMargin;

final int bottom = child.getBottom() + params.bottomMargin + mHorizonLineWidth;

final int left = child.getRight() + params.rightMargin;

int right = left + mVerticalLineWidth;

mDividerDrawable.setBounds(left, top, right, bottom);

mDividerDrawable.draw(c);

}

}

@Override

public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)

{

int spanCount = getSpanCount(parent);

int childCount = parent.getAdapter().getItemCount();

int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();

if (itemPosition < 0)

return;

int column = itemPosition % spanCount;

int bottom;

int left = column * mVerticalLineWidth / spanCount;

int right = mVerticalLineWidth - (column + 1) * mVerticalLineWidth / spanCount;

if (isLastRaw(parent, itemPosition, spanCount, childCount))

bottom = isDrawLastLine ? mHorizonLineWidth : 0;

else

bottom = mHorizonLineWidth;

outRect.set(left, 0, right, bottom);

}

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();

return spanCount;

}

private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount)

{

RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();

if (layoutManager instanceof GridLayoutManager)

{

int remainCount = childCount % spanCount;

if (remainCount == 0)

return pos >= childCount - spanCount;

else

return pos >= childCount - childCount % spanCount;

}

else if (layoutManager instanceof StaggeredGridLayoutManager)

{

int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation();

if (orientation == StaggeredGridLayoutManager.VERTICAL)

{

// 水平滚动

int remainCount = childCount % spanCount;

if (remainCount == 0)

return pos >= childCount - spanCount;

else

return pos >= childCount - childCount % spanCount;

}

else // 垂直滚动

return (pos + 1) % spanCount == 0;

}

else if (layoutManager instanceof LinearLayoutManager)

{

return pos >= parent.getAdapter().getItemCount() - 1;

}

return false;

}

}

android 分割线 整洁,Android-RecyclerView分割线(水平/垂直/网格)相关推荐

  1. android view上下滚动条,Android自定义View六(ViewGroup水平垂直滚动实现类似支付宝年度账单的效果)...

    先看两张效果图 1.垂直滑动 onegif.gif 2.水平滑动 twoGIF.gif 先看使用方法 1.AndroidStudio 引入 Project.gradle repositories { ...

  2. android 水平方向瀑布流,Android RecyclerView(瀑布流)水平/垂直方向分割线

     Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...

  3. Android 活用RecyclerView分割线

    1.ItemDecoration简介 Recyclerview是我们日常开发中使用频率比较高的的控件,而其中的ItemDecoration作为布局装饰又能很方便的帮助我们定义分割线,列表排行效果以及设 ...

  4. android 分割线布局,Android RecyclerView网格布局(支持多种分割线)详解(2)

    记录了下RecyclerView的使用方法,并且讲述了线性布局列表的使用方法,在此基础上加上了万能分割线,支持颜色分割线和图片分割线,同时支持对分割线设置线宽. 这篇是总结一下网格布局的使用,同样也支 ...

  5. Android零基础入门第65节:RecyclerView分割线开发技巧

    2019独角兽企业重金招聘Python工程师标准>>> 在上一期通过简单学习,已经领略到了RecyclerView的灵活性,当然都是一些最基础的用法,那么本期一起来学习Recycle ...

  6. Android移动开发之【Android实战项目】Recyclerview添加花色分割线

    最近在做项目的过程中发现干巴巴的Recyclerview真的不好看,这里讲一下怎么一句话加默认的分割线,并且改变分割线的样式. 文章目录 一.添加默认分割线 二.修改样式 三.设置方法 通过 setD ...

  7. android gridview行分割线,Android使用GridView实现表格分割线效果

    使用gridview实现表格分割线效果,网格布局表格布局也是可以实现的. 效果如下: 1.主函数代码: package com.example.qd.douyinwu; import android. ...

  8. Android史上最强分割线全攻略

    借鉴自 https://blog.csdn.net/megatronkings/article/details/52156312 说实话,分割线这个东西,真的太难太难了!!! 难在何处?难在用最对的方 ...

  9. Android布局之边框、分割线

    Android布局之边框.分割线 先上图,实现如下图样式 布局文件使用Linerlayout垂直布局即可,这里省略,主要需要添加如下样式: <?xml version="1.0&quo ...

最新文章

  1. DELL optiplex 解决改回 AHCI蓝屏问题
  2. python基础知识梳理-Python基础知识梳理 - 第03部分
  3. ORC文件存储格式的深入探究
  4. SQL Server 2005将某些数据库行为设置为与指定的 SQL Server 版本兼容
  5. 基因编辑婴儿追踪:该被编辑的是我们的心
  6. Kickfire Enters into MySQL Enterprise Agreement with Sun
  7. OpenShift 4 Hands-on Lab (13) 使用持久化存储
  8. 21日请假一天陪妈妈去国博
  9. git中clone出来项目,导入到eclipse并运行web项目
  10. Template Method (模板方法模式)
  11. oracle 密码过期处理
  12. x射线直接投影成像的条件_无损检测之X射线检测实时成像技术分辨率
  13. Selenium批量下载抖音无水印高清视频
  14. 智能清洁新消费的2021:不止营销造势,还有实力突围
  15. tf.matrix_diag和tf.matrix_inverse的用法(tensorflow如何生成对角矩阵和求逆矩阵)
  16. python turtle怎么画海绵宝宝_画师绘制海绵宝宝性转拟人,派大星变小帅哥,又脑补一出甜蜜大戏...
  17. pytorch: 给tensor删除或者添加维度为1的维度(squeeze和unsqueeze)
  18. DockerScan:Docker安全分析测试工具
  19. oc怎么去除场景中的光斑?渲染有光斑光点
  20. 广西最大陨石被盗案告破 人赃俱获

热门文章

  1. cocos2dx:addAnimation如何创建精灵动画并在工程中调用展示
  2. 高级程序员和低级程序员
  3. 使用BRAKER2进行基因组注释
  4. import obspy报错‘numpy.int64‘ object has no attribute ‘split‘`
  5. 生日蛋糕烟花动画CSS3js特效
  6. 微信小程序设置页面标题
  7. 从网络工程师沦落到网管,是自己不争气,或许也有其他原因。 ...
  8. 三菱mode bus tcp通讯_长治三菱Q01CPU
  9. 有了这三款软件,你家的智能电视和电视盒子就够用了
  10. 英语六级仔细阅读中的陷阱