zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    }
  • 相关阅读:
    Atitit 集团与个人的完整入口列表 attilax的完整入口 1. 集团与个人的完整入口列表 1 2. 流量入口概念 2 3. 流量入口的历史与发展 2 1.集团与个人的完整入口列表
    atitit 每季度日程表 每季度流程 v3 qaf.docx Ver history V2 add diary cyar data 3 cate V3 fix detail 3cate ,
    Atitit react 详细使用总结 绑定列表显示 attilax总结 1. 前言 1 1.1. 资料数量在百度内的数量对比 1 1.2. 版本16 v15.6.1 1 1.3. 引入js 2
    Atitit r2017 r3 doc list on home ntpc.docx
    Atitit r2017 ra doc list on home ntpc.docx
    Atiitt attilax掌握的前后技术放在简历里面.docx
    Atitit q2016 qa doc list on home ntpc.docx
    Atitit r7 doc list on home ntpc.docx 驱动器 D 中的卷是 p2soft 卷的序列号是 9AD0D3C8 D:\ati\r2017 v3 r01\
    Atitit 可移植性之道attilax著
    Atitit q2016 q5 doc list on home ntpc.docx
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7359985.html
Copyright © 2011-2022 走看看