1. 程式人生 > >Android仿 京東切換 商品列表 佈局效果

Android仿 京東切換 商品列表 佈局效果

效果圖:
在這裡插入圖片描述
在這裡插入圖片描述

上面兩幅圖分別是點選右上角按鈕後顯示兩種不同佈局的效果。簡單的流程可以概括為:第一次進入頁面,有個預設的佈局(豎直的線性佈局),點選按鈕,由豎直的線性佈局切換到網格佈局,再次點選切換到豎直的線性佈局。

分析:
可以看到商品展示的形式都是以列表的方式來展現,我用的是RecyclerView,這種列表並不複雜,配合Adapter資料介面卡就實現了。
看到這個需求時,問了朋友,他說使用了兩個Adapter、兩個佈局實現了這個效果。當時聽了,我的內心是崩潰的。這樣的設計方案在實際的App開發中是絕對不行的。如果單純的為了實現這個功能,那麼可以理解。但是實際應用當中,資料都來自伺服器,那麼我們為了這麼一個切換功能,還要去多請求一次伺服器嗎,多儲存一些不必要的欄位嗎?顯然這種設計方案是不行的。
RecyclerView強大的功能也支援了可以在不同佈局之間的切換功能(LinearLayout,GridLyout,Stragged等等)。說到這,相信大家都想到了RecyclerView的佈局管理器:LayoutManager。沒錯!就是它了
這是網格佈局的管理器:
在這裡插入圖片描述


這是線性佈局的管理器
在這裡插入圖片描述

RecyclerView的setLayoutanager()方法可以讓其佈局在不同的排列方式間進行切換,常見的:從線性佈局到網格佈局、瀑布流。上面我們要實現的效果,其實就是從網格佈局到線性佈局的一個切換。看到這,相信大家都明白了,原來這一個方法就能搞定了,不過還別高興的太早了。如果是簡單的格式切換,利用上面的方式就已經完成了這種效果,但是我專案的效果在切換前和切換後的Item佈局是不一樣的,所以可以參考多佈局的思路,RecyclerView的Adapter中有一個getItemViewType(int position)方法,來區別每一個Item的佈局。我們需要重寫該方法來實現不同的佈局方式。在重寫該方法時,返回值為Int型。利用該方法的返回值,我們就可以在onCreateViewHolder方法中去根據該返回值載入不用的佈局了,然後在onBindViewHolder方法中同樣根據不同的type去繫結對應佈局的對應控制元件。

基本的實現流程,到這裡就介紹完了,下面是具體的實現
第一步:在adapter中重寫getItemViewType()方法;新增setType(int type)方法

/**
     * 點選切換的時候呼叫過這個方法
     * 商品排列的方式 1:垂直列表排列 2:網格
     *
     * @param type
     */
    public void setType(int type) {
        this.type = type;
    }

    @Override
    public int getItemViewType(int position) {
        return type;
    }

第二步:在onCreateViewHolder()方法中根據自己設定的佈局型別切換item佈局

@NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = null;
        RecyclerView.ViewHolder holder = null;
        switch (i) {
            case Line:
                view = LayoutInflater.from(context).inflate(R.layout.xrecyclelin_item, null);
                holder = new LineHolder(view);
                break;
            case Grid:
                view = LayoutInflater.from(context).inflate(R.layout.xrecyclegrid_item, null);
                holder = new GridHolder(view);
                break;
        }
        return holder;
    }

第三步:在點選切換佈局圖片時

//                切換
                if (c) {
                    c = false;
//                   1: 設定佈局型別
                    goodAdapter.setType(2);
//                    2:設定佈局型別
                    RecyclerView.LayoutManager manager = new GridLayoutManager(this, 2);
                    recycler.setLayoutManager(manager);
//                   3: 重新整理介面卡
                    goodAdapter.notifyDataSetChanged();
                } else {
                    c = true;
                    goodAdapter.setType(1);
                    LinearLayoutManager manager = new LinearLayoutManager(this);
                    recycler.setLayoutManager(manager);
                    goodAdapter.notifyDataSetChanged();
                }

到此列表的佈局切換就全部搞定了。
github地址:https://github.com/victorlj/RecycleViewDome