作者:燕歆波

导读:一个页面里有标题和内容,内容是网格布局,可以理解为标题和内容作为一个item出现,一开始想用多个RecyclerView实现,可是想想就痛苦,刚想百度,就想起来RecyclerView的GridLayout可是指定item占几列或者几行。于是使用GridLyout来实现了。

[{"name":"哈哈","code":"shbx","sort":1,"childs":[{"name":"哈哈","code":"sbcx","url":"http://www.lkgjj.com/PersonalQuery.aspx","icon":"http://192.168.10.112:8082/sp_web/dsf/app/apply/dl.do?id=84358","sort":1,"uuid":"64d0f1324bc24853bb37f9ac2c1fe962","categoryCode":"shbx","id":84359}]},{"name":"哈哈","code":"cydh","sort":2,"childs":[{"name":"哈哈","code":"cydh","url":"http://m.46644.com/tel/","icon":"http://192.168.10.112:8082/sp_web/dsf/app/apply/dl.do?id=84361","sort":1,"uuid":"e9909c84d3f44767887b9b435f2321ac","categoryCode":"cydh","id":84362}]},{"name":"哈哈","code":"fczx","sort":3,"childs":[{"name":"哈哈","code":"sfcx","url":"https://m.fang.com/esf/lankao/","icon":"http://192.168.10.112:8082/sp_web/dsf/app/apply/dl.do?id=84365","sort":1,"uuid":"e11b2af94d874dd2b95deb6cb898566b","categoryCode":"fczx","id":84366}]},{"name":"哈哈","code":"cxxz","sort":4,"childs":[{"name":"哈哈","code":"hccc","url":"http://m.46644.com/train/","icon":"http://192.168.10.112:8082/sp_web/dsf/app/apply/dl.do?id=84382","sort":1,"uuid":"9355e25ced36462f8556bf1be2fe2e75","categoryCode":"cxxz","id":83752}]}]

数据基本都是这样子的;
先把第一级的category抽出来,变成和里面的子元素一样的数据结构,然后按照顺序放到一个list里面,将数据传给adapter,在adapter中,来处理category和childs的类型;

全局定义两种类型,TYPE_TITLE和TYPE_VALUE,

    /*** 标题*/final static int TYPE_TITLE = 0;/*** 内容*/final static int TYPE_VALUE = 1;

由于我们是将category重新生成了一个childs,所以有些属性它是没有的,所以在类型判断的时候,我们根据属性判断这个item是title还是value:

    @Overridepublic int getItemViewType(int position) {ConveniceServiceBean.ChildsBean childsBean = mServiceList.get(position);if (childsBean.getCategoryCode() != null) {return TYPE_VALUE;} else {return TYPE_TITLE;}}

然后在onCreateViewHolder方法中,根据type,判断应该加载哪一个view:

    @Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {if (viewType == TYPE_TITLE) {View view = View.inflate(mContext, R.layout.item_convenice_category_top_layout, null);return new TitleHolder(view);} else if (viewType == TYPE_VALUE) {View view = View.inflate(mContext, R.layout.item_convenice_service_layout, null);return new ServiceHolder(view);} else {View view = View.inflate(mContext, R.layout.item_convenice_service_layout, null);return new ServiceHolder(view);}}

由于有两种布局,所以我们要有两个ViewHolder:

public class ServiceHolder extends RecyclerView.ViewHolder

public class TitleHolder extends RecyclerView.ViewHolder

在绑定数据的时候,需要判断是哪一个ViewHolder:

 @Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {if (holder instanceof ServiceHolder) {}else if (holder instanceof TitleHolder) {}

然后分别设置不同的数据,需要注意的一点,在一开始创建adapter的时候,我们在泛型中一般会指定viewholder的名称,如果是多重item的话,不需要指定,而是要填写原始的ViewHolder,不然,在判断的时候可能会报红:

public class ConveniceServiceAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>

最后,我们给RecyclerView设置adapter的时候,指定管理器,然后设置setSpanSizeLookup方法,在方法中判断当前是占一列还是两列:

MyGridLayoutManager myGridLayoutManager = new MyGridLayoutManager(this,2, OrientationHelper.VERTICAL,false);myGridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {@Overridepublic int getSpanSize(int position) {ConveniceServiceBean.ChildsBean childsBean = childsBeanList.get(position);if(childsBean.getCategoryCode() == null){return 2;//占两列}else{return 1;//占一列}}});rv_service.setLayoutManager(myGridLayoutManager);rv_service.setAdapter(new ConveniceServiceAdapter2(this,childsBeanList));

这样就实现了上面title,下面网格的布局!

RecyclerView使用GridLayoutManager实现两种item相关推荐

  1. RecyclerView设置分割线的两种方法

    方法一.在item条目布局中直接在底部设置一个View,背景设置成想要的分割线颜色,高度设置成1dp, 这个方法很简单,只是是小聪明啦.... 方法二.在给recyclerview设置各种参数的时候 ...

  2. 【JetPack】视图绑定 ( ViewBinding ) 各种应用 ( 视图绑定两种方式 | Activity 布局 | 对话框布局 | 自定义组件布局 | RecyclerView 列表布局 )

    文章目录 I . 视图绑定 ( ViewBinding ) 界面的两种方式 II . Activity 界面中 应用 视图绑定 ( ViewBinding ) III . Dialog 对话框界面中 ...

  3. Android两种时间轴实现

    两种实现的效果一样(左边嵌套,右边数据平铺) 代码链接https://download.csdn.net/download/hxinfiniti/11141747 实现时间轴的两种方式: 1.嵌套Re ...

  4. 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...

    java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...

  5. jvm两种方式获取对象所占用的内存

    在开发过程中,我们有时需要来获取某个对象的大小,以方便我们参考,来决定开发的技术方案.jvm中提供了两种方式来获取一个对象的大小. 通过Instrumentation来计算对象的大小 编写计算代码: ...

  6. python提交表单无效_使用Django Form解决表单数据无法动态刷新的两种方法

    一.无法动态更新数据的实例 1. 如下,数据库中创建了班级表和教师表,两张表的对应关系为"多对多" from django.db import models class Class ...

  7. python列表的排序方法_pythonlist排序的两种方法及实例

    本文主要介绍了python list排序的两种方法及实例讲解.具有很好的参考价值,下面一起来看下吧 对List进行排序,Python提供了两个方法 方法1.用List的内建函数list.sort进行排 ...

  8. EasyUI Pagination 分页的两种做法

    EasyUI 的 datagrid 支持服务器端分页,但是官方的资料比较少,以下总结了两种 datagrid 的服务器端分页机制,可根据情况具体使用. 一:使用 datagrid 默认机制 后台: p ...

  9. 绝对路径与相对路径的区别【2】--release和debug这两种情况下对本地文件操作不一致的问题...

    总感觉题目起的有点别扭,但是不明白这是不是应该归因于这两种编译模式的区别,所以只能用这个长而晦涩的题目了. 我们在做一些应用程序时,经常会用XML文件存放一些程序的配置信息,甚或一些少量数据信息,而且 ...

最新文章

  1. 为什么 sin(x²)+sin(y²)=1 的图像这么复杂?
  2. mpVue配置sass全局变量
  3. JQuery对checkbox的操作
  4. Java数据结构与算法:栈
  5. ubuntu12.04升级后找不到共享目录
  6. 个人的小项目mysql_mgr_test开放了
  7. spark RDD创建方式:parallelize,makeRDD,textFile
  8. jzoj4274-终章-剑之魂【位运算,贪心】
  9. C核心技术手册(四十二)
  10. 处理veh调试器检测_越狱检测抖音逻辑???
  11. Mono 的Virtual PC 虚拟机
  12. iOS上传应用到AppStore出现Authenticating with the iTunes store
  13. 恩布企业 IM 安卓端 1.1 增强版本
  14. 【面试】造价工程师面试试题汇总
  15. 行人重识别(ReID) ——基于MGN-pytorch进行可视化展示
  16. 计算机组成原理(笔记)
  17. 工作中那些让人印象深刻的BUG(2)
  18. B2B、B2C、C2C、O2O分别是什么
  19. 抓包微信小程序openid的教程
  20. 宝塔BT面板专业版(付费)和免费版有什么区别?

热门文章

  1. Ralph W. Tyler【拉尔夫·泰勒】
  2. 奇店社区团购智慧电商V1.3.9版本_团购小程序源码
  3. 【附源码】计算机毕业设计SSM社区团购服务系统
  4. 财报汇总 | 快手、TCL电子、同程艺龙、勃林格殷格翰等28家企业公布最新业绩...
  5. macbook os 10.15.1中没有“任何来源”如何访问app?
  6. 同r做一个窗口_怎样在触摸屏上做一个自定义的弹出窗口?
  7. python怎么提取字符串中的数字_python如何提取字符串中的数字
  8. 师傅带徒弟学HTML+CSS-关东升-专题视频课程
  9. 计算机毕设(附源码)JAVA-SSM基于B_S的汽车售后服务管理系统
  10. 全攻略自制esp8266 WIFI智能排插教程