RecycleView的网格样式
网格样式
RecyclerView展示的样式由布局管理器LayoutManager来控制。
网格样式的管理器是GridLayoutManager
,看一下它最常用的两个构造函数以及参数含义。
- GridLayoutManager(Context context, int spanCount)
- spanCount,每列或者每行的item个数,设置为1,就是列表样式
- 该构造函数默认是竖直方向的网格样式
- GridLayoutManager(Context context, int spanCount, int orientation,boolean reverseLayout)
- spanCount,每列或者每行的item个数,设置为1,就是列表样式
- 网格样式的方向,水平(OrientationHelper.HORIZONTAL)或者竖直(OrientationHelper.VERTICAL)
- reverseLayout,是否逆向,true:布局逆向展示,false:布局正向显示
// 竖直方向的网格样式,每行四个Item
mLayoutManager = new GridLayoutManager(this, 4, OrientationHelper.VERTICAL, false);
mRecyclerView.setLayoutManager(mLayoutManager);
网格样式已经显示出来了,和之前遇见的问题一样,没有间隔线,非常丑,间隔线必须加,而且要使用自定义,不使用系统自带的。
新建文件md_divider.xml,是一个灰色的矩形。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle" ><solid android:color="@android:color/darker_gray"/><size android:height="4dp" android:width="4dp"/>
</shape>
在styles.xml中的自定义的应用主题里替换掉listdivider属性。
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item><item name="android:listDivider">@drawable/md_divider</item>
</style>
然后继承RecyclerView.ItemDecoration
类,在构造函数里获取自定义的间隔线,复写绘制间隔线的方法。
public class MDGridRvDividerDecoration extends RecyclerView.ItemDecoration {private static final int[] ATTRS = new int[]{android.R.attr.listDivider};// 用于绘制间隔样式private Drawable mDivider;public MDGridRvDividerDecoration(Context context) {// 获取默认主题的属性final TypedArray a = context.obtainStyledAttributes(ATTRS);mDivider = a.getDrawable(0);a.recycle();}@Overridepublic void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {// 绘制间隔,每一个item,绘制右边和下方间隔样式int childCount = parent.getChildCount();int spanCount = ((GridLayoutManager)parent.getLayoutManager()).getSpanCount();int orientation = ((GridLayoutManager)parent.getLayoutManager()).getOrientation();boolean isDrawHorizontalDivider = true;boolean isDrawVerticalDivider = true;int extra = childCount % spanCount;extra = extra == 0 ? spanCount : extra;for(int i = 0; i < childCount; i++) {isDrawVerticalDivider = true;isDrawHorizontalDivider = true;// 如果是竖直方向,最右边一列不绘制竖直方向的间隔if(orientation == OrientationHelper.VERTICAL && (i + 1) % spanCount == 0) {isDrawVerticalDivider = false;}// 如果是竖直方向,最后一行不绘制水平方向间隔if(orientation == OrientationHelper.VERTICAL && i >= childCount - extra) {isDrawHorizontalDivider = false;}// 如果是水平方向,最下面一行不绘制水平方向的间隔if(orientation == OrientationHelper.HORIZONTAL && (i + 1) % spanCount == 0) {isDrawHorizontalDivider = false;}// 如果是水平方向,最后一列不绘制竖直方向间隔if(orientation == OrientationHelper.HORIZONTAL && i >= childCount - extra) {isDrawVerticalDivider = false;}if(isDrawHorizontalDivider) {drawHorizontalDivider(c, parent, i);}if(isDrawVerticalDivider) {drawVerticalDivider(c, parent, i);}}}@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {int spanCount = ((GridLayoutManager) parent.getLayoutManager()).getSpanCount();int orientation = ((GridLayoutManager)parent.getLayoutManager()).getOrientation();int position = parent.getChildLayoutPosition(view);if(orientation == OrientationHelper.VERTICAL && (position + 1) % spanCount == 0) {outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());return;}if(orientation == OrientationHelper.HORIZONTAL && (position + 1) % spanCount == 0) {outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);return;}outRect.set(0, 0, mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight());}/* 绘制竖直间隔线* @param canvas* @param parent 父布局,RecyclerView* @param position item在父布局中所在的位置 */private void drawVerticalDivider(Canvas canvas, RecyclerView parent, int position) {final View child = parent.getChildAt(position);final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();final int top = child.getTop() - params.topMargin;final int bottom = child.getBottom() + params.bottomMargin + mDivider.getIntrinsicHeight();final int left = child.getRight() + params.rightMargin;final int right = left + mDivider.getIntrinsicWidth();mDivider.setBounds(left, top, right, bottom);mDivider.draw(canvas);}/* 绘制水平间隔线* @param canvas* @param parent 父布局,RecyclerView* @param position item在父布局中所在的位置 */private void drawHorizontalDivider(Canvas canvas, RecyclerView parent, int position) {final View child = parent.getChildAt(position);final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();final int top = child.getBottom() + params.bottomMargin;final int bottom = top + mDivider.getIntrinsicHeight();final int left = child.getLeft() - params.leftMargin;final int right = child.getRight() + params.rightMargin + mDivider.getIntrinsicWidth();mDivider.setBounds(left, top, right, bottom);mDivider.draw(canvas);}
}
设置RecyclerView的间隔线。
mRecyclerView.addItemDecoration(new MDGridRvDividerDecoration(this));
关于网格样式的RecyclerView使用大体和列表样式相同,主要在于间隔线的实现上有些不同,来看一下如果真正的使用自定义的间隔线需要做些什么。
- 实现间隔线样式,可以是xml文件也可以是图片
- 覆盖应用主题的listdivider属性,使用自定义的间隔线样式
- 继承
RecyclerView.ItemDecoration
类,并实现其中的绘制间隔线方法 - 设置RecyclerView间隔线样式
RecycleView的网格样式相关推荐
- echarts 网格属性_设置echarts_的网格样式颜色
设需朋者说上事是础一发一开程和开数的目前间置echarts的网格新直能分支调二浏页器朋代说,事刚样式颜色 参考AP用它互不直曾经明以机会式近分扯.多接相常I文档:http://echarts.baid ...
- Android之如何实现阿拉伯版本(RTL)的recycleView的网格布局
1 问题 比如正常的recycleView的网格布局效果如下 1 2 34 5 67 8 现在需要变成这样的效果 3 2 16 5 48 7 2 思考过程和尝试解决方法 1)从recycleView上 ...
- gss1_GSS简介:网格样式表
gss1 You may have recently heard of Grid Style Sheets (GSS) in the world of HTML and CSS. GSS re-ima ...
- html5下拉列表显示多列,多列网格样式下拉列表框美化jQuery插件
Multi-Column-Select是一款多列网格样式下拉列表框美化jQuery插件.通过该插件可以将下拉列表转换为多列的网格选项布局.它支持下拉列表的单选和多选,在鼠标滑过列表选项时还带有一些有趣 ...
- 设置echarts 的网格样式颜色
设置echarts的网格样式颜色 参考API文档:http://echarts.baidu.com/option.html#xAxis.splitLine option = {xAxis: {type ...
- EditorGridPanel的网格样式以及编辑属性设置
1.添加(设置)单元格样式 function SetMyColumns(value, cell, record, rowIndex, columnIndex, store) {if((columnIn ...
- ECharts修改坐标轴,坐标轴字体,坐标轴网格样式
var myChart = echarts.init(document.getElementById('testDIV')); //初始化echarts页面显示的空间//--------------- ...
- ECharts修改坐标轴,坐标轴字体,坐标轴网格样式以及控制坐标轴是否显示
首先要将一个图表显示在前端页面上: var myChart = echarts.init(document.getElementById('testDIV')); //初始化echarts页面显示的空 ...
- android新手 ppt展示 画板 AsyncTask异步(room数据库 快速本地查询) 数据保存及动态更新
最近做了一款软件,功能不大, 展示ppt和画图, 但是融合了很多知识 ,还包含一些逻辑, 成功运行, 很适合新手, 但说到底小项目包含不了android整套知识, 所以还需要大家自己去慢慢扩展- 欢迎 ...
最新文章
- (发现)问题才是推动创新的动力系列:两种类型硬币(均匀和非均匀)能否用第一次得正面朝上的概率推断“第一第二次依次获得正面反面情况”的概率?
- 学水利的想转行计算机,为什么说千万别学水利水电工程?附水利八大院排名2020年(最新)...
- 工作207:修改表头按钮样式
- JVM源码分析--ClassLoader类加载器
- 制造业一声叹息!干30年实业不如炒股?
- matlab 删掉空行,在MATLAB中使用XLSWRITE:如何删除空单元格?
- dch中mysql作用_解析Cloudera Manager内部结构、功能包括配置文件、目录位置等
- 让openkore 更节省你的CPU和内存
- 游戏修改器制作教程七:注入DLL的各种姿势
- 雷电4模拟器安装xposed框架(2022年)
- 错误: 此上下文中不允许函数定义。
- CentOS下查看本机ip地址方法
- 主成分分析(PCA)详解
- 卡西欧计算机开机键,卡西欧手表怎么开机
- torch.flatten
- 涂涂乐的详细实现之三--文件IO操作
- 【Excel】提取中/英文字符
- 快捷复制网页文字小技巧
- 计算机浏览器无法上网怎么办,电脑ie浏览器无法上网,浅析win10电脑ie浏览器无法上网的解决方法...
- 盒子科技笔试Java_丰巢科技 Java高级笔试面试题 PDF 下载
热门文章
- iOS用户体验之-导航之道
- YUV422(UYVY)转RGB565源代码及其讲解.md
- 用CSS使DIV水平居中
- 演示FilterConfig接口的getInitParameter(String name)方法
- 演示<jsp:forward>动作元素
- 3-Spring Boot的数据访问
- 输入法中的全角和半角是什么,角又是什么
- javascript实现下拉条联动_JavaScript gt;gt;gt; 003
- iterator遍历_HashMap 的 7 种遍历方式与性能分析!(强烈推荐)
- php调用ruby,ruby、javascript、php中的观察者模式实现代码