网格样式

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的网格样式相关推荐

  1. echarts 网格属性_设置echarts_的网格样式颜色

    设需朋者说上事是础一发一开程和开数的目前间置echarts的网格新直能分支调二浏页器朋代说,事刚样式颜色 参考AP用它互不直曾经明以机会式近分扯.多接相常I文档:http://echarts.baid ...

  2. Android之如何实现阿拉伯版本(RTL)的recycleView的网格布局

    1 问题 比如正常的recycleView的网格布局效果如下 1 2 34 5 67 8 现在需要变成这样的效果 3 2 16 5 48 7 2 思考过程和尝试解决方法 1)从recycleView上 ...

  3. gss1_GSS简介:网格样式表

    gss1 You may have recently heard of Grid Style Sheets (GSS) in the world of HTML and CSS. GSS re-ima ...

  4. html5下拉列表显示多列,多列网格样式下拉列表框美化jQuery插件

    Multi-Column-Select是一款多列网格样式下拉列表框美化jQuery插件.通过该插件可以将下拉列表转换为多列的网格选项布局.它支持下拉列表的单选和多选,在鼠标滑过列表选项时还带有一些有趣 ...

  5. 设置echarts 的网格样式颜色

    设置echarts的网格样式颜色 参考API文档:http://echarts.baidu.com/option.html#xAxis.splitLine option = {xAxis: {type ...

  6. EditorGridPanel的网格样式以及编辑属性设置

    1.添加(设置)单元格样式 function SetMyColumns(value, cell, record, rowIndex, columnIndex, store) {if((columnIn ...

  7. ECharts修改坐标轴,坐标轴字体,坐标轴网格样式

    var myChart = echarts.init(document.getElementById('testDIV')); //初始化echarts页面显示的空间//--------------- ...

  8. ECharts修改坐标轴,坐标轴字体,坐标轴网格样式以及控制坐标轴是否显示

    首先要将一个图表显示在前端页面上: var myChart = echarts.init(document.getElementById('testDIV')); //初始化echarts页面显示的空 ...

  9. android新手 ppt展示 画板 AsyncTask异步(room数据库 快速本地查询) 数据保存及动态更新

    最近做了一款软件,功能不大, 展示ppt和画图, 但是融合了很多知识 ,还包含一些逻辑, 成功运行, 很适合新手, 但说到底小项目包含不了android整套知识, 所以还需要大家自己去慢慢扩展- 欢迎 ...

最新文章

  1. (发现)问题才是推动创新的动力系列:两种类型硬币(均匀和非均匀)能否用第一次得正面朝上的概率推断“第一第二次依次获得正面反面情况”的概率?
  2. 学水利的想转行计算机,为什么说千万别学水利水电工程?附水利八大院排名2020年(最新)...
  3. 工作207:修改表头按钮样式
  4. JVM源码分析--ClassLoader类加载器
  5. 制造业一声叹息!干30年实业不如炒股?
  6. matlab 删掉空行,在MATLAB中使用XLSWRITE:如何删除空单元格?
  7. dch中mysql作用_解析Cloudera Manager内部结构、功能包括配置文件、目录位置等
  8. 让openkore 更节省你的CPU和内存
  9. 游戏修改器制作教程七:注入DLL的各种姿势
  10. 雷电4模拟器安装xposed框架(2022年)
  11. 错误: 此上下文中不允许函数定义。
  12. CentOS下查看本机ip地址方法
  13. 主成分分析(PCA)详解
  14. 卡西欧计算机开机键,卡西欧手表怎么开机
  15. torch.flatten
  16. 涂涂乐的详细实现之三--文件IO操作
  17. 【Excel】提取中/英文字符
  18. 快捷复制网页文字小技巧
  19. 计算机浏览器无法上网怎么办,电脑ie浏览器无法上网,浅析win10电脑ie浏览器无法上网的解决方法...
  20. 盒子科技笔试Java_丰巢科技 Java高级笔试面试题 PDF 下载

热门文章

  1. iOS用户体验之-导航之道
  2. YUV422(UYVY)转RGB565源代码及其讲解.md
  3. 用CSS使DIV水平居中
  4. 演示FilterConfig接口的getInitParameter(String name)方法
  5. 演示<jsp:forward>动作元素
  6. 3-Spring Boot的数据访问
  7. 输入法中的全角和半角是什么,角又是什么
  8. javascript实现下拉条联动_JavaScript gt;gt;gt; 003
  9. iterator遍历_HashMap 的 7 种遍历方式与性能分析!(强烈推荐)
  10. php调用ruby,ruby、javascript、php中的观察者模式实现代码