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

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

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

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

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

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

/**
* 今日订单数
* <p>
* 作者:余天然 on 2017/3/6 下午12:01
*/
@Route(path = "/home/order")
public class TodayOrderActivity extends BaseActivity { @BindView(R.id.rv_content)
RecyclerView rvContent; int[] layoutIds = {
R.layout.item_home_order_head,
R.layout.item_home_order_body,
R.layout.item_home_order_foot,
R.layout.item_divider10_gray,
R.layout.item_divider10_white,
}; SuperAdapter adapter; @Override
protected int createLayoutId() {
return R.layout.activity_today_order;
} @Override
public void initWidget() {
setTitleText("今日订单"); rvContent.setLayoutManager(new LinearLayoutManager(this));
adapter = new SuperAdapter(this, layoutIds);
rvContent.setAdapter(adapter);
DividerFactory.setDivider(rvContent, DividerType.FOOT, R.color.gray_divider, R.dimen.divider_1, LinearLayoutManager.VERTICAL); adapter.setData(mockData());
} private List<LayoutWrapper> mockData() {
List<LayoutWrapper> wrappers = new ArrayList<>();
wrappers.add(new LayoutWrapper(R.layout.item_divider10_gray, "", null));
wrappers.add(new LayoutWrapper(R.layout.item_home_order_head, "广州尚都布业", headDisplayer));
wrappers.add(new LayoutWrapper(R.layout.item_home_order_body, "一键开单", bodyDisplayer));
wrappers.add(new LayoutWrapper(R.layout.item_home_order_foot, new FootItem(, "90.00"), footDisplayer)); wrappers.add(new LayoutWrapper(R.layout.item_divider10_gray, "", null));
wrappers.add(new LayoutWrapper(R.layout.item_home_order_head, "王鹏", headDisplayer));
wrappers.add(new LayoutWrapper(R.layout.item_home_order_body, "全棉色织格子布", bodyDisplayer));
wrappers.add(new LayoutWrapper(R.layout.item_divider10_white, "", null));
wrappers.add(new LayoutWrapper(R.layout.item_home_order_body, "尼龙", bodyDisplayer));
wrappers.add(new LayoutWrapper(R.layout.item_home_order_foot, new FootItem(, "170.00"), footDisplayer)); return wrappers;
} DataDisplayer<String> headDisplayer = new DataDisplayer<String>() {
@Override
public void bindData(BaseViewHolder holder, String item, int position) {
holder.setText(R.id.tv_name, item);
}
}; DataDisplayer<String> bodyDisplayer = new DataDisplayer<String>() {
@Override
public void bindData(BaseViewHolder holder, String item, int position) {
holder.setText(R.id.tv_goods, item);
}
}; DataDisplayer<FootItem> footDisplayer = new DataDisplayer<FootItem>() {
@Override
public void bindData(BaseViewHolder holder, FootItem item, int position) {
String price = String.format("合计 ¥%s", item.price);
String number = String.format("(共%s件商品 优惠¥12 运费到付)", item.number);
holder.setText(R.id.tv_total_price, price);
holder.setText(R.id.tv_total_number, number);
}
}; class FootItem {
Integer number;
String price; public FootItem(Integer number, String price) {
this.number = number;
this.price = price;
}
}
}

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. UI_UIImagePickerController(读取图片)

    创建图片 #pragma mark - 创建 photoImageView - (void)createphotoImageView { self.photoImageView = [[UIImage ...

  2. linux下线程

    linux下线程 线程与进程的关系: 之前转载的微信文章,进程与线程的差别已经说得比較清楚了.能够查看之前转载的文章.linux进程与线程的差别. 创建一个线程: #include<pthrea ...

  3. Perl怎样过滤html标签

    比方一串字符串 <div><b>123</b></div> 假设仅仅想拿到123怎么办呢? 用perl的正則表達式能够非常easy的做到. $str = ...

  4. UVALive 4222 /HDU 2961 Dance 大模拟

    Dance Problem Description For a dance to be proper in the Altered Culture of Machinema, it must abid ...

  5. NOIP2017提高组模拟赛 10 (总结)

    NOIP2017提高组模拟赛 10 (总结) 第一题 机密信息 FJ有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的 ...

  6. Linux就该这么学 20181004(第六章磁盘管理)

    参考链接https://www.linuxprobe.com/ /boot 开机锁需要文件-内核.开机菜单以及所需配置文件 /dev 以文件形式存放的任何设备与接口 /etc 配置文件 /home 用 ...

  7. [luogu P2123] 皇后游戏 解题报告(贪心)

    题目链接:https://www.luogu.org/problemnew/show/P2123 题目大意: 给定a数组和b数组,要求最小化c数组中的最大值 题解: 考虑微扰法,推一波式子先 设$x= ...

  8. Codeforces 986B. Petr and Permutations(没想到这道2250分的题这么简单,早知道就先做了)

    这题真的只能靠直觉了,我没法给出详细证明. 解题思路: 1.交换3n次或者7n+1次,一定会出现一个为奇数,另一个为偶数. 2.用最朴素的方法,将n个数字归位,计算交换次数. 3.判断交换次数是否与3 ...

  9. How Javascript works (Javascript工作原理) (八) WebAssembly 对比 JavaScript 及其使用场景

    个人总结: webworker有以下三种: Dedicated Workers 由主进程实例化并且只能与之进行通信 Shared Workers 可以被运行在同源的所有进程访问(不同的浏览的选项卡,内 ...

  10. oracle和mysql的分页

    如果我们是通过JDBC的方式访问数据库,那么就有必要根据数据库类型采取不同的SQL分页语句,对于MySql数据库,我们可以采用limit语句进行分页,对于Oracle数据库,我们可以采用rownum的 ...