android gridview 间隔线,Android开发之RecyclerView的间隔线处理
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的间隔线处理相关推荐
- Android开发之RecyclerView动态添加item长按删除item源码
我们先看下效果图: 效果还是很不错的. 实现思路: 设置recyclerview为GridLayoutManager布局,单行个数为4个 GridLayoutManager linearLayoutM ...
- Android开发之RecyclerView的交互动画(实现拖拽和删除)
做RecyclerView做相关的动画效果的时候,用的最多的是v7包下的ItemTouchHelper类,这个类很强大,如有兴趣的童鞋可以自行翻看源码,接下来我带领大家实现RecyclerView相关 ...
- Android开发之RecyclerView嵌套ListView自动计算高度的方法
老套路看图:下面是我在我爱我家在职时候做的一个小需求记录下 最外层是个RecylerView子布局里面的房屋描述信息是个listview根据后台返回字段动态显示的高度. 解决思路:可以计算每个list ...
- android gridview滑动卡,Android RecyclerView的卡顿问题
本文其实是上一篇Android本地app操作相关基础的延伸,然而内容基本没什么联系了(初学者身份瞬间暴露,打一枪换一个地方←_←),就不好意思再添个"续"或者"(2)&q ...
- android 判断byte值_Android开发之UDP可靠性传输
轩羽:Android开发之UDPzhuanlan.zhihu.com 在这一篇文章里,小编说到UDP是不可靠的,故,我们要自己写一套协议,来使UDP实现可靠性传输,这里,小编和小编的小伙伴一起,写了 ...
- android蓝牙4.0(BLE)开发之ibeacon初步
一个april beacon里携带的信息如下 ? 1 <code class=" hljs ">0201061AFF4C0002159069BDB88C11416BAC ...
- 慕课大学基于Android P 的移动应用开发之第6章ListView
1.自定义BaseAdapter适配ListView 1创建布局文件 <?xml version="1.0" encoding="utf-8"?> ...
- android gridview行分割线,Android中控件GridView实现设置行列分割线的方法示例
前言 虽然Aandroid目前已经有RecyclerView了.非常强大的一个View.可以直接控制成ListView以及GridView等.而且画框线也比较方便.但是呢在很多情况下我们不得不仍然使用 ...
- android gridview行分割线,Android使用GridView实现表格分割线效果
使用gridview实现表格分割线效果,网格布局表格布局也是可以实现的. 效果如下: 1.主函数代码: package com.example.qd.douyinwu; import android. ...
最新文章
- 《零基础入门学习Python》学习过程笔记【30模块中的函数,os模块,ospath模块中的函数(看了一点)】...
- Lucene的评分(score)机制研究
- 201312-1- 出现次数最多的数
- 1.1节 Buck Converter--降压转换器 part1
- 如何在Windows下安装Linux子系统(Ubuntu,openSUSU,SUSU Linux Server)
- 前端学习(2977):vue-element-admin
- php 图片不让下载,php让图片可以下载的方法
- pymysql流式读取数据库
- 服务器维护家电需要电工证吗,物业电工需要电工证吗
- Windows 10开机可以跳过锁屏界面的操作方法
- “37岁,985毕业,年薪50万,被裁掉只用了10分钟”
- bayer raw RGB raw
- 语音识别技术竟然发展如此迅速
- Python中常见的保留字(33+2)
- ctfshow 做题 MISC入门 模块 11-20
- 微信小程序实现表情包编辑
- 为了得到一个数的“相反数“,我们将这个数的数字顺序颠倒,然后再加上原先的数得到“相反数“。
- Vectorcast 2021 sp4 linux
- Windows定时运行python程序
- ecmall 后台新增菜单
热门文章
- 【遗传优化BP网络】基于自适应遗传算法的BP神经网络的股票预测MATLAB仿真
- 自动增益控制AGC的simulink仿真
- wireshark无权限
- 小菜学习Lucene.Net(更新3.0.3版本使用)
- 介绍Windows Server服务器角色、角色服务和功能
- VHDL+Verilog良好的代码编写风格(转载)
- 阿里云服务器怎么安装docker
- PAT甲级1104 Sum of Number Segments:[C++题解]数段之和,测试点2爆double,请用long double!!!
- 简单介绍android studio中的Logcat
- 服务器不响应Ajax,web前端:解决在IE11浏览器下,JQuery的AJAX方法不响应问题