RecyclerView让列表嵌套如此简单

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

这里呢,说一下我自己的思路,我没有使用列表嵌套,而是,将原有的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(1, "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(2, "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;
        }
    }
}
时间: 2024-12-29 12:49:25

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

RecyclerView和ScrollView嵌套使用

我们的recyclerView有多个layoutmanager,通过重写layoutmanager的方法就可以让recyclerView和ScrollView嵌套了.但是请注意,如果recyclerView很长那么强烈不建议去做嵌套,因为这样recyclerView会在展示的时候立刻展示所有内容,效率极低. 本文的两部分代码来自一个博主的博客,另一个是我自己写的,正好可以完全适用于现有的layoutmanager.大家需要的化可以试试,应该问题不大. 原博主的demo:https://githu

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

我们上篇讲到了无序列表,那么今天就来看看有序列表和他们的组合嵌套使用吧. 有序列表 现在我们要做那堆杂事了,但是发现这么多杂事,先做哪个好呢?于是我们给这堆杂事弄个优先级排序,让我们能够按照顺序做下去.HTML里用<ol>标签来表示有序列表,<ol>标签的列表项依然是用<li>标签表示. 它的代码模板是这样的: <span style="font-family:Microsoft YaHei;"><ol>       <

str和byte类型,列表嵌套,元祖

utf-8 编码,一个汉字,三个字节,  一个字节8位,01010101 用一个16进制 name='中文' for i in name: bytes_list=bytes((i),encoding='utf8') #字节默认16进制 print(bytes_list) b'\xe4\xb8\xad' '''228 0b11100100 184 0b10111000 173 0b10101101 b'\xe6\x96\x87' 230 0b11100110 150 0b10010110 135

python-分解多列表嵌套

针对多列表嵌套,如何获取所有元素? 之前使用for循环+if判断,进行分解,如下: for first_layer in lists:        if isinstance(first_layer,list):            for second_layer in first_layer: if isinstance(second_layer,list): for third_layer in second_layer: print third_layer else:        

案例:python列表嵌套字典实现备忘录

1.使用字典和列表嵌套结构表示多条记录2.添加信息时,直接输入一句话,进行解析拆解,记录时间与事件3.不同信息采用不同颜色输出 #!/user/bin/env Python # _*_ coding:utf-8 _*_ # 51memo.py # author:大宝dayday见 __author__ = '大宝dayday见' desc = '51备忘录'.center(30,'-') print(desc) welcome = 'welcome' print(f'{welcome}作者:',

列表嵌套字典,根据字典某一key排序

在返回列表嵌套字典时候,往往需要对数据进行一定的处理:按照字典中某一个key排序 In [87]: a = [{"name": "牛郎", "age": 23},{"name":"许仙", "age": 20},{"name":"董永", "age": 18}] In [88]: a Out[88]: [{'name': '牛郎

列表嵌套列表,打印其中的每个元素

呵呵,听太白视频做一个列表嵌套列表,然后打印其中的每一个元素,具体代码如下: li = [1,2,3,4,['Mr.lee',5,6,],'donghai','egon'] for i in li: if isinstance(i,list): for new_each in i: print(new_each) else: print(i) 原文地址:https://www.cnblogs.com/m-r-lee/p/12157405.html

Android实现RecyclerView自定义列表、点击事件以及下拉刷新

Android使用RecyclerView 1. 什么是RecyclerView RecyclerView 是 Android-support-v7-21 版本中新增的一个 Widgets,官方对于它的介绍则是:RecyclerView 是 ListView 的升级版本,更加先进和灵活. 简单来说就是:RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式.它被作为ListView和GridView控件的继承者,在最新的support-V7版本中提供支持. 2.

for语句与if语句嵌套的简单应用

1.循环语句 for(初始条件:循环条件:状态改变) { 循环体 } break为跳出循环,continue为结束此次循环. 2.死循环常用while语句 while(判断语句) { if(判断) { break } } 凑钱问题 用一元,两元,五元三种面值的钱凑20元有几种方法. <script> var count=0; for(var one=0;one<=20;one++) { for(var two=0;two<=10;two++) { for(var five=0;fi