平常开发时,相信像这样的页面,大家一定是遇到过的。这里比较坑爹的地方在于呢:列表嵌套。订单列表中的每一项,都包含一个商品列表。像这种需求,大家会如何实现呢?

这里呢,说一下我自己的思路,我没有使用列表嵌套,而是,将原有的Order拆分成了三个布局类型:Head、Body、Foot,一个Body就是一个商品,有多个商品就有多个Body。

然后,使用我自己封装的一套Adapter,让多布局更加简单易用。关于我的这个Adapter库,详见:Adapter的封装之路

不过,这里稍稍麻烦的一点就是,得到网络数据之后,我们需要对原始的List<Order>进行加工,转换成我们需要的List<LayoutWrapper>,具体转换的方法,类似于我这里的mockData里面的方法。

每一个LayoutWrapper都会持有:布局id、实体类、实体的展示类

其实,这里的实体展示类,如果是公用的,最好不要做成内部类,做成外部类

  1. /**
  2. * 今日订单数
  3. * <p>
  4. * 作者:余天然 on 2017/3/6 下午12:01
  5. */
  6. @Route(path = "/home/order")
  7. public class TodayOrderActivity extends BaseActivity {
  8.  
  9. @BindView(R.id.rv_content)
  10. RecyclerView rvContent;
  11.  
  12. int[] layoutIds = {
  13. R.layout.item_home_order_head,
  14. R.layout.item_home_order_body,
  15. R.layout.item_home_order_foot,
  16. R.layout.item_divider10_gray,
  17. R.layout.item_divider10_white,
  18. };
  19.  
  20. SuperAdapter adapter;
  21.  
  22. @Override
  23. protected int createLayoutId() {
  24. return R.layout.activity_today_order;
  25. }
  26.  
  27. @Override
  28. public void initWidget() {
  29. setTitleText("今日订单");
  30.  
  31. rvContent.setLayoutManager(new LinearLayoutManager(this));
  32. adapter = new SuperAdapter(this, layoutIds);
  33. rvContent.setAdapter(adapter);
  34. DividerFactory.setDivider(rvContent, DividerType.FOOT, R.color.gray_divider, R.dimen.divider_1, LinearLayoutManager.VERTICAL);
  35.  
  36. adapter.setData(mockData());
  37. }
  38.  
  39. private List<LayoutWrapper> mockData() {
  40. List<LayoutWrapper> wrappers = new ArrayList<>();
  41. wrappers.add(new LayoutWrapper(R.layout.item_divider10_gray, "", null));
  42. wrappers.add(new LayoutWrapper(R.layout.item_home_order_head, "广州尚都布业", headDisplayer));
  43. wrappers.add(new LayoutWrapper(R.layout.item_home_order_body, "一键开单", bodyDisplayer));
  44. wrappers.add(new LayoutWrapper(R.layout.item_home_order_foot, new FootItem(, "90.00"), footDisplayer));
  45.  
  46. wrappers.add(new LayoutWrapper(R.layout.item_divider10_gray, "", null));
  47. wrappers.add(new LayoutWrapper(R.layout.item_home_order_head, "王鹏", headDisplayer));
  48. wrappers.add(new LayoutWrapper(R.layout.item_home_order_body, "全棉色织格子布", bodyDisplayer));
  49. wrappers.add(new LayoutWrapper(R.layout.item_divider10_white, "", null));
  50. wrappers.add(new LayoutWrapper(R.layout.item_home_order_body, "尼龙", bodyDisplayer));
  51. wrappers.add(new LayoutWrapper(R.layout.item_home_order_foot, new FootItem(, "170.00"), footDisplayer));
  52.  
  53. return wrappers;
  54. }
  55.  
  56. DataDisplayer<String> headDisplayer = new DataDisplayer<String>() {
  57. @Override
  58. public void bindData(BaseViewHolder holder, String item, int position) {
  59. holder.setText(R.id.tv_name, item);
  60. }
  61. };
  62.  
  63. DataDisplayer<String> bodyDisplayer = new DataDisplayer<String>() {
  64. @Override
  65. public void bindData(BaseViewHolder holder, String item, int position) {
  66. holder.setText(R.id.tv_goods, item);
  67. }
  68. };
  69.  
  70. DataDisplayer<FootItem> footDisplayer = new DataDisplayer<FootItem>() {
  71. @Override
  72. public void bindData(BaseViewHolder holder, FootItem item, int position) {
  73. String price = String.format("合计 ¥%s", item.price);
  74. String number = String.format("(共%s件商品 优惠¥12 运费到付)", item.number);
  75. holder.setText(R.id.tv_total_price, price);
  76. holder.setText(R.id.tv_total_number, number);
  77. }
  78. };
  79.  
  80. class FootItem {
  81. Integer number;
  82. String price;
  83.  
  84. public FootItem(Integer number, String price) {
  85. this.number = number;
  86. this.price = price;
  87. }
  88. }
  89. }

RecyclerView让列表嵌套如此简单的更多相关文章

  1. RecyclerView和ScrollView嵌套使用

    我们的recyclerView有多个layoutmanager,通过重写layoutmanager的方法就可以让recyclerView和ScrollView嵌套了.但是请注意,如果recyclerV ...

  2. Android RecyclerView和ScrollView嵌套使用

    我们的recyclerView有多个layoutmanager,通过重写layoutmanager的方法就可以让recyclerView和ScrollView嵌套了.但是请注意,如果recyclerV ...

  3. python 字典和列表嵌套用法

    python中字典和列表的使用,在数据处理中应该是最常用的,这两个熟练后基本可以应付大部分场景了.不过网上的基础教程只告诉你列表.字典是什么,如何使用,很少做组合说明. 刚好工作中采集promethe ...

  4. python_字典列表嵌套的排序问题

    上一篇我们聊到python 字典和列表嵌套用法,这次我们聊聊字典和列表嵌套中的排序问题,这个在python基础中不会提到,但实际经常运用,面试中也喜欢问,我们娓娓道来. 在说组合排序之前,先来看看排序 ...

  5. HTML&CSS基础学习笔记1.14—有序列表及列表嵌套

    我们上篇讲到了无序列表,那么今天就来看看有序列表和他们的组合嵌套使用吧. 有序列表 现在我们要做那堆杂事了,但是发现这么多杂事,先做哪个好呢?于是我们给这堆杂事弄个优先级排序,让我们能够按照顺序做下去 ...

  6. Python中关于列表嵌套列表的处理

    在处理列表的时候我们经常会遇到列表中嵌套列表的结构,如果我们要把所有元素放入一个新列表,或者要计算所有元素的个数的话应该怎么做呢? 第一个例子 对于上图中的这样一组数据,如果我们要知道这个CSV文件中 ...

  7. python 使用 sorted 对 列表嵌套元组的数据进行排序

    在开发的过程可能会遇到这么一个需求,存在一个列表嵌套元组的数据: data = [(1, 'a'),(2, 'b'),(5, 'c'),(3, 'd'),(4, 'e')] 需要将这个列表按照元组的第 ...

  8. android开发 RecyclerView 瀑布列表布局

    1.写一个内容的自定义小布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xm ...

  9. python 将列表嵌套字典的unicode字符串转换为str格式的字符串的方法

    今天在进行django开发的过程中遇到了一个非常棘手的问题, 因为需求原因, 需要将一份数据存为json格式到数据库中, 如下面这种格式: list_1 = [{"name":&q ...

随机推荐

  1. Mongodb简单介绍

    1. 简单介绍 Mongodb是一种强大.灵活,可扩展的数据存储方式.属于nosql.非关系型数据库的一种. mongodb是面向文档的数据库. 尽管是非关系型数据库.可是它保留了很多关系型数据库的特 ...

  2. IE input X 去掉文本框的叉叉和password输入框的眼睛图标

    IE input X 去掉文本框的叉叉和password输入框的眼睛图标 从IE 10開始,type="text" 的 input 在用户输入内容后.会自己主动产生一个小叉叉(X) ...

  3. artTemplate的使用

    引言 腾讯的前端模板引擎,不逊于doT.js 1.引入 <script type="text/javascript" src="../plugin/artTempl ...

  4. 一题多解(一) —— list(Python)判空(以及 is 与 == 的区别)

    >> l = [] 1. == >> l == [] True 2. not >> not l True 3. 注意 is 与 == 的区别 >> l ...

  5. sicily 题目分类

    为了方便刷题,直接把分类保存下来方便来找. 转自:http://dengbaoleng.iteye.com/blog/1505083 [数据结构/图论] 1310Right-HeavyTree笛卡尔树 ...

  6. Ubuntu14.04下Mongodb(在线安装方式|apt-get)安装部署步骤(图文详解)(博主推荐)

    不多说,直接上干货! 本博文介绍了MongoDB,并详细指引读者在Ubuntu下MongoDB的安装和使用.本教程在Ubuntu14.04下测试通过. 一.MongoDB介绍 MongoDB 是一个是 ...

  7. 新型查询系统impala

    这羊头很酷... Apache Impala是Apache Hadoop的开源本地分析数据库.Impala由Cloudera,MapR,Oracle和Amazon提供. 在Hadoop上进行BI风格的 ...

  8. P2742 [USACO5.1]圈奶牛Fencing the Cows

    题目描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必须包括他的奶牛喜欢吃草的所有地点.对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度. 输入输出格式 输入 ...

  9. jQuery学习(七)——使用JQ完成下拉列表左右选择

    1.需求:实现以下功能 2.步骤分析: 第一步:确定事件(鼠标单击事件click) 第二步:获取左侧下拉列表被选中的option($(“#left option:selected”)) [假设左侧se ...

  10. 【转载】Xmemcached用户指南

    一.XMemcached简介 XMemcached是一个新java memcachedclient.也许你还不知道memcached是什么?可以先看看这里.简单来说,Memcached 是一个高性能的 ...