RecyclerView没有默认的分割线,需要自己绘制,接下来我会为大家绘制三种线:水平线、竖直线、和网格线。

废话少说,马上开车!!!

---------------------------------------------华丽的分割线------------------------------------------------------------

水平线实现:在原来的代码中添加

mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));

即可实现分割线,不过默认的分割线颜色个人感觉有点不太漂亮,大家看图说话:

想要改变分割线的颜色只能在theme中添加该属性

@drawable/divider_bg

然后在drawable中添加背景色

android:shape="rectangle">

android:centerColor="#ffff0000"

android:endColor="#ffff0000"

android:startColor="#ffff0000"

android:type="linear" />

为了看起来更亮眼我全部设置成了骚红色,来大家看效果图:

看一下gridview和瀑布流的效果:

---------------------------------------------华丽的分割线------------------------------------------------------------

竖直线:和水平线同样的道理只需要改动一点代码即可只需要把vertical改成horizontal即可。

mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL));

看效果图:

---------------------------------------------华丽的分割线------------------------------------------------------------

网格线:大家估计该注意到问题了,像gridView网格状的该怎么搞啊其实有个很简单的方法,写一个水平的然后在写一个竖直的不就ok了嘛。。。

mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL));

mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));

这是一种偷懒的方法,效果嘛就只能呵呵了,大家看效果图:

丑丑丑。。。

---------------------------------------------华丽的分割线------------------------------------------------------------

网格线的优雅写法:其实想解决这个问题,没办法只有看源码了,源码分析我就不带大家分析了,大家有兴趣的自己可以ctrl+鼠标左键自行查看,我这里的思路是:重写ItemDecoration类,同时绘制水平和竖直线,当然了为了保证下面的线不能超过你的内容,需要加以判断有多少行多少列。。。具体怎么实现的,代码奉上:(感谢一下dn学院的ricky老师)

public class DividerGridViewItemDecoration extends RecyclerView.ItemDecoration {

private Drawable mDivider;

private int[] attrs = new int[]{android.R.attr.listDivider};

public DividerGridViewItemDecoration(Context context) {

TypedArray typedArray = context.obtainStyledAttributes(attrs);

mDivider = typedArray.getDrawable(0);

typedArray.recycle();

}

@Override

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

drawVertical(c, parent);

drawHorizontal(c, parent);

}

private void drawHorizontal(Canvas c, RecyclerView parent) {

// 绘制水平间隔线

int childCount = parent.getChildCount();

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

View child = parent.getChildAt(i);

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

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

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

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

int bottom = top + mDivider.getIntrinsicHeight();

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

mDivider.draw(c);

}

}

private void drawVertical(Canvas c, RecyclerView parent) {

//绘制垂直间隔线(垂直的矩形)

int childCount = parent.getChildCount();

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

View child = parent.getChildAt(i);

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

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

int right = left + mDivider.getIntrinsicWidth();

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

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

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

mDivider.draw(c);

}

}

@Override

@Deprecated

public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {

// 四个方向的偏移值

int right = mDivider.getIntrinsicWidth();

int bottom = mDivider.getIntrinsicHeight();

if (isLastColum(itemPosition, parent)) {//是否是最后一列

right = 0;

}

if (isLastRow(itemPosition, parent)) {//是最后一行

bottom = 0;

}

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

}

/**

* 是否是最后一行

*/

private boolean isLastRow(int itemPosition, RecyclerView parent) {

int spanCount = getSpanCount(parent);

RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();

//有多少列

if (layoutManager instanceof GridLayoutManager) {

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

int lastRowCount = childCount % spanCount;

//最后一行的数量小于spanCount

if (lastRowCount == 0 || lastRowCount < spanCount) {

return true;

}

}

return false;

}

/**

* 判断是否是最后一列

*/

private boolean isLastColum(int itemPosition, RecyclerView parent) {

RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();

//有多少列

if (layoutManager instanceof GridLayoutManager) {

int spanCount = getSpanCount(parent);

if ((itemPosition + 1) % spanCount == 0) {

return true;

}

}

return false;

}

private int getSpanCount(RecyclerView parent) {

RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();

if (layoutManager instanceof GridLayoutManager) {

GridLayoutManager lm = (GridLayoutManager) layoutManager;

int spanCount = lm.getSpanCount();

return spanCount;

}

return 0;

}

}

然后添加一下代码即可优雅的实现网格效果的线

DividerGridViewItemDecoration dividerGridViewItemDecoration = new DividerGridViewItemDecoration(this);

mRecyclerView.addItemDecoration(dividerGridViewItemDecoration);

效果图走起:

---------------------------------------------华丽的分割线------------------------------------------------------------

下一节还是带领大家继续处理recyclerView的相关问题,还望大家支持。。。

android gridview 间隔线,Android开发之RecyclerView的间隔线处理相关推荐

  1. Android开发之RecyclerView动态添加item长按删除item源码

    我们先看下效果图: 效果还是很不错的. 实现思路: 设置recyclerview为GridLayoutManager布局,单行个数为4个 GridLayoutManager linearLayoutM ...

  2. Android开发之RecyclerView的交互动画(实现拖拽和删除)

    做RecyclerView做相关的动画效果的时候,用的最多的是v7包下的ItemTouchHelper类,这个类很强大,如有兴趣的童鞋可以自行翻看源码,接下来我带领大家实现RecyclerView相关 ...

  3. Android开发之RecyclerView嵌套ListView自动计算高度的方法

    老套路看图:下面是我在我爱我家在职时候做的一个小需求记录下 最外层是个RecylerView子布局里面的房屋描述信息是个listview根据后台返回字段动态显示的高度. 解决思路:可以计算每个list ...

  4. android gridview滑动卡,Android RecyclerView的卡顿问题

    本文其实是上一篇Android本地app操作相关基础的延伸,然而内容基本没什么联系了(初学者身份瞬间暴露,打一枪换一个地方←_←),就不好意思再添个"续"或者"(2)&q ...

  5. android 判断byte值_Android开发之UDP可靠性传输

    轩羽:Android开发之UDP​zhuanlan.zhihu.com 在这一篇文章里,小编说到UDP是不可靠的,故,我们要自己写一套协议,来使UDP实现可靠性传输,这里,小编和小编的小伙伴一起,写了 ...

  6. android蓝牙4.0(BLE)开发之ibeacon初步

    一个april beacon里携带的信息如下 ? 1 <code class=" hljs ">0201061AFF4C0002159069BDB88C11416BAC ...

  7. 慕课大学基于Android P 的移动应用开发之第6章ListView

    1.自定义BaseAdapter适配ListView 1创建布局文件 <?xml version="1.0" encoding="utf-8"?> ...

  8. android gridview行分割线,Android中控件GridView实现设置行列分割线的方法示例

    前言 虽然Aandroid目前已经有RecyclerView了.非常强大的一个View.可以直接控制成ListView以及GridView等.而且画框线也比较方便.但是呢在很多情况下我们不得不仍然使用 ...

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

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

最新文章

  1. 《零基础入门学习Python》学习过程笔记【30模块中的函数,os模块,ospath模块中的函数(看了一点)】...
  2. Lucene的评分(score)机制研究
  3. 201312-1- 出现次数最多的数
  4. 1.1节 Buck Converter--降压转换器 part1
  5. 如何在Windows下安装Linux子系统(Ubuntu,openSUSU,SUSU Linux Server)
  6. 前端学习(2977):vue-element-admin
  7. php 图片不让下载,php让图片可以下载的方法
  8. pymysql流式读取数据库
  9. 服务器维护家电需要电工证吗,物业电工需要电工证吗
  10. Windows 10开机可以跳过锁屏界面的操作方法
  11. “37岁,985毕业,年薪50万,被裁掉只用了10分钟”
  12. bayer raw RGB raw
  13. 语音识别技术竟然发展如此迅速
  14. Python中常见的保留字(33+2)
  15. ctfshow 做题 MISC入门 模块 11-20
  16. 微信小程序实现表情包编辑
  17. 为了得到一个数的“相反数“,我们将这个数的数字顺序颠倒,然后再加上原先的数得到“相反数“。
  18. Vectorcast 2021 sp4 linux
  19. Windows定时运行python程序
  20. ecmall 后台新增菜单

热门文章

  1. 【遗传优化BP网络】基于自适应遗传算法的BP神经网络的股票预测MATLAB仿真
  2. 自动增益控制AGC的simulink仿真
  3. wireshark无权限
  4. 小菜学习Lucene.Net(更新3.0.3版本使用)
  5. 介绍Windows Server服务器角色、角色服务和功能
  6. VHDL+Verilog良好的代码编写风格(转载)
  7. 阿里云服务器怎么安装docker
  8. PAT甲级1104 Sum of Number Segments:[C++题解]数段之和,测试点2爆double,请用long double!!!
  9. 简单介绍android studio中的Logcat
  10. 服务器不响应Ajax,web前端:解决在IE11浏览器下,JQuery的AJAX方法不响应问题