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;
        }
    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM