RecyclerView让列表嵌套如此简单

Posted 星辰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
        }
    }
}

 

 

以上是关于RecyclerView让列表嵌套如此简单的主要内容,如果未能解决你的问题,请参考以下文章

Recyclerview 滚动在嵌套滚动视图中的片段中不起作用

将数据从 RecyclerView.Adapter 传递到片段 onClick

Android 嵌套片段方法

在recyclerview的嵌套recyclerview中的嵌套列表中添加项目

共享元素转换在父片段和子片段之间不起作用(嵌套片段)

RecyclerView里面嵌套一个无限循环的横向列表该怎么做