仿京東購物車Deom

寫代碼前要先加上權限和依賴:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
依賴:

compile 'com.android.support:design:26.+'	//tablayout依賴
compile 'com.google.code.gson:gson:2.8.2'
compile 'com.github.bumptech.glide:glide:3.6.0' 
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okio:okio:1.11.0'
compile 'com.android.support:recyclerview-v7:26.+'
因爲購物車的邏輯性很強,所以寫購物車之前要想清楚要寫哪一步,不然很容易蒙圈...

各種需要的工具類中的東西

封裝的OkHttp(我是用的OkHttp3請求數據);
因爲是封裝的,在這裏就不多說了,見接口:
一些可能用到的接口:

//加入購物車
public static final String ADDCART_API = "https://www.zhaoapi.cn/product/addCart?uid=2845";
//購物車
public static final String SELECTART_API = "https://www.zhaoapi.cn/product/getCarts?uid=2845";
//更新購物車
public static final String UpDateCart_API = "https://www.zhaoapi.cn/product/updateCarts";
//刪除購物車
public static final String DELETECART_API = "https://www.zhaoapi.cn/product/deleteCart";
用MVP的模式寫,很清晰也很快;

MVP模式:

到了model層就不要忘了bean包,有些bean包可能要自己手動加入一些東西;
這個在購物車的bean包會讓自己手動加入全選的判斷(因爲我用的接口沒有)
public static class DataBean {

    //自己寫幾個方法(3)

    private boolean allChildInGroupCheck;

    public boolean isGroupCheck() {
        return allChildInGroupCheck;
    }
    public void setGroupCheck(boolean allChildInGroupCheck) {
        this.allChildInGroupCheck = allChildInGroupCheck;
    }

    /**
     * list : [{"bargainPrice":399,"createtime":"2017-10-02T15:20:02","detailUrl":"https://item.m.jd.com/product/1439822107.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t5887/201/859509257/69994/6bde9bf6/59224c24Ne854e14c.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5641/233/853609022/57374/5c73d281/59224c24N3324d5f4.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5641/233/853609022/57374/5c73d281/59224c24N3324d5f4.jpg!q70.jpg","num":2,"pid":81,"price":699,"pscid":85,"selected":0,"sellerid":2,"subhead":"滿2件,總價打6.50","title":"Gap男裝 休閒舒適簡約水洗五袋直筒長褲緊身牛仔褲941825 深灰色 33/32(175/84A)"}]
     * sellerName : 商家2
     * sellerid : 2
     */
CountPriceBean,這個bean包是計算價錢的包;
public class CountPriceBean {
    private String priceString;
    private int count;

    public CountPriceBean(String priceString, int count) {
        this.priceString = priceString;
        this.count = count;
    }

    public String getPriceString() {
        return priceString;
    }

    public void setPriceString(String priceString) {
        this.priceString = priceString;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}

Model層:

public class CarModel {
    private final ICartPre iCartPre;

    public CarModel(ICartPre iCartPre){
        this.iCartPre = iCartPre;
    }

    public void getData(String url){
        OkHttp3Util.doGet(url, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()){
                    String string = response.body().string();
                    CartBean cartBean = new Gson().fromJson(string, CartBean.class);
                    iCartPre.onSuccess(cartBean);
                }
            }
        });
    }
}
Presenter層:

//p層的一個接口:

public interface ICartPre {
    void onSuccess(CartBean cartBean);
}
//p層接口的實現類:

public class CartPresenter implements ICartPre {

    private CarModel carModel;
    private ICartView iCartView;

    public CartPresenter(ICartView iCartView){
        this.iCartView = iCartView;
        carModel = new CarModel(this);
    }

    public void getData(String url){
        carModel.getData(url);
    }
    @Override
    public void onSuccess(CartBean cartBean) {
        iCartView.onSuccess(cartBean);
    }
}
//View層:

//view層接口:

public interface ICartView {
    void onSuccess(CartBean cartBean);
}
//view層接口的實現類就是Activity或fragment:

//實現接口先不着急,先完成主頁面的佈局:

要注意,購物車的列表是二級列表,所以自定義一個二級列表:

/**
 * Created by Administrator
 * 購物車的二級列表
 */

public class CartTwoListView extends ExpandableListView {
    public CartTwoListView(Context context) {
        super(context);
    }

    public CartTwoListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CartTwoListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    //重寫測量的方法

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int height = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, height);
    }
}

購物車的主佈局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="CartActivity">

    <RelativeLayout
        android:id="@+id/rl1"
        android:layout_width="match_parent"
        android:layout_height="50dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="購物車"
            android:textSize="26sp" />
    </RelativeLayout>

    <ScrollView
        android:id="@+id/sl1"
        android:layout_below="@+id/rl1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <!--二級購物車列表-->
            <wwx.util.CartTwoListView
                android:id="@+id/cartTwoListView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

            </wwx.util.CartTwoListView>

            <!--爲你推薦-->
            <TextView
                android:layout_width="match_parent"
                android:layout_height="300dp"
                android:text="爲你推薦"
                android:background="#0f0"/>
        </LinearLayout>
    </ScrollView>

    <RelativeLayout
        android:id="@+id/progressBar"
        android:visibility="gone"
        android:layout_centerInParent="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </RelativeLayout>
    <LinearLayout
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#fff"
        android:orientation="horizontal">
        <CheckBox
            android:id="@+id/check_all"
            android:layout_width="40dp"
            android:gravity="center"
            android:layout_height="40dp" />
        <TextView
            android:id="@+id/text_total"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:text="合計:0.00"/>
        <TextView
            android:id="@+id/text_buy"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:textColor="#fff"
            android:layout_height="match_parent"
            android:gravity="center"
            android:background="#f00"
            android:layout_marginLeft="10dp"
            android:text="去計算(0)"/>
    </LinearLayout>
</RelativeLayout>

購物車的主頁面:

/**
 * 仿京東購物車
 */
public class CartActivity extends AppCompatActivity implements ICartView, View.OnClickListener {

    private CartTwoListView cartTwoListView;
    private CheckBox check_all;
    private TextView text_total;
    private TextView text_buy;
    private CartPresenter cartPresenter;
    private RelativeLayout progressBar;
    private CartAdapter adapter;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0) {
                CountPriceBean countPriceBean = (CountPriceBean) msg.obj;
                Log.i("hand", countPriceBean.getPriceString());
                //設置價格和數量
                text_total.setText("合計:¥" + countPriceBean.getPriceString());
                text_buy.setText("去結算(" + countPriceBean.getCount() + ")");

            }
        }
    };
    private CartBean cartBean;
    private String priceString;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cart);
        findView();

    }

    private void findView() {
        cartTwoListView = findViewById(R.id.cartTwoListView);
        progressBar = findViewById(R.id.progressBar);
        check_all = findViewById(R.id.check_all);
        text_total = findViewById(R.id.text_total);
        text_buy = findViewById(R.id.text_buy);

    }

    @Override
    protected void onResume() {
        super.onResume();

        cartPresenter = new CartPresenter(this);
        cartPresenter.getData(Api.SELECTART_API);
        //去掉二級列表默認的顯示器
        cartTwoListView.setGroupIndicator(null);
        //剛進入頁面時讓progressBar顯示
        progressBar.setVisibility(View.VISIBLE);
        //全選按鈕的設置
        check_all.setOnClickListener(this);
        //點擊去結算  		如果不跳轉到訂單這裏的點擊操作不用做
        text_buy.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //進入訂單頁面前先創建訂單
                //先判斷價錢是否相同再跳轉(這裏和適配器裏的計算價錢的數據一樣)
                double price = 0;
                for (int i = 0; i < cartBean.getData().size(); i++) {
                    List<CartBean.DataBean.ListBean> listBeans = cartBean.getData().get(i).getList();
                    for (int j = 0; j < listBeans.size(); j++) {

                        if (listBeans.get(j).getSelected() == 1) {
                            price += listBeans.get(j).getBargainPrice() * listBeans.get(j).getNum();
                        }
                    }
                }

                //double高精度,,,計算的時候可能會出現一串數字...保留兩位
                DecimalFormat decimalFormat = new DecimalFormat("0.00");
                priceString = decimalFormat.format(price);
                tiaoDingDan();
            }
        });
    }

    private void tiaoDingDan() {
        Map<String, String> map = new HashMap<>();
        map.put("uid", "2845");
        map.put("price", priceString);
        OkHttp3Util.doPost(Api.CHUANGJIAN_API, map, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                if (response.isSuccessful()) {
                    final String string = response.body().string();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            CreateDingBean createDingBean = new Gson().fromJson(string, CreateDingBean.class);
                            if (createDingBean.getCode().equals("0")) {
                                Toast.makeText(CartActivity.this, createDingBean.getMsg(), Toast.LENGTH_SHORT).show();
                                Intent intent = new Intent(CartActivity.this, DingDanActivity.class);
                                startActivity(intent);
                            } else {
                                Toast.makeText(CartActivity.this, createDingBean.getMsg(), Toast.LENGTH_SHORT).show();

                            }
                        }
                    });
                }

            }
        });
    }

    /**
     * 重寫的購物車的方法
     *
     * @param cartBean
     */
    @Override
    public void onSuccess(final CartBean cartBean) {
        this.cartBean = cartBean;
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                List<CartBean.DataBean> cartList = cartBean.getData();
                //數據獲取成功後隱藏
                progressBar.setVisibility(View.GONE);
                //如果購物有東西的時候
                if (cartBean != null) {

                    //1.設置適配器
                    adapter = new CartAdapter(CartActivity.this, cartBean, progressBar, cartPresenter, handler);
                    cartTwoListView.setAdapter(adapter);

                    //2.展開二級列表的數據
                    for (int i = 0; i < cartList.size(); i++) {
                        cartTwoListView.expandGroup(i);
                    }

                    //3.設置組的初始狀態
                    for (int i = 0; i < cartList.size(); i++) {
                        //先找出當前數組中的所有的孩子
                        List<CartBean.DataBean.ListBean> listBeans = cartList.get(i).getList();
                        //根據孩子的狀態設置組的初始狀態是否選中
                        cartList.get(i).setGroupCheck(isAllChildInGroupCheck(listBeans));//把孩子都放進去
                    }

                    //4.根據選中計算加減和數量(因爲操作都是在適配器中進行,所以放到適配器裏執行)
                    adapter.sendPriceAndCount();

                } else {
                    Toast.makeText(CartActivity.this, "購物車是空的", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }


    /**
     * 根據孩子listBeans ,設置組的初始狀態是否選中
     *
     * @param listBeans
     */
    private boolean isAllChildInGroupCheck(List<CartBean.DataBean.ListBean> listBeans) {
        for (int i = 0; i < listBeans.size(); i++) {
            //只要有一個組未選中 返回false
            if (listBeans.get(i).getSelected() == 0) {
                return false;
            }
        }
        return true;
    }


    /**
     * 全選按鈕的設置
     *
     * @param v
     */
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.check_all:
                adapter.setAllCheck(check_all.isChecked());//根據選擇的狀態判斷
                break;

        }
    }


}

//各種操作都放到適配器中:

適配器
//先來一級條目和二級條目的佈局
一級條目的佈局 : group_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <CheckBox
        android:id="@+id/group_check"
        android:layout_width="40dp"
        android:layout_height="40dp"/>
    <TextView
        android:id="@+id/group_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:text="商家"/>
</LinearLayout>
二級條目的佈局: child_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <CheckBox
        android:id="@+id/child_check"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="center"/>

    <ImageView
        android:id="@+id/child_image"
        android:layout_width="100dp"
        android:padding="10dp"
        android:layout_height="100dp"
        android:src="@mipmap/ic_launcher"/>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_weight="3"
        android:layout_height="match_parent"
        android:padding="10dp"
        android:orientation="vertical">
        <TextView
            android:id="@+id/child_title"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="標題"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/child_price"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:textColor="#f00"
                android:text="¥:0.00"/>

            <LinearLayout
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:orientation="horizontal">
                <TextView
                    android:id="@+id/child_jian"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="5dp"
                    android:textSize="16sp"
                    android:text=""/>
                <TextView
                    android:id="@+id/child_num"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="5dp"
                    android:textSize="16sp"
                    android:text="1"/>
                <TextView
                    android:id="@+id/child_jia"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="5dp"
                    android:textSize="16sp"
                    android:text=""/>
            </LinearLayout>

        </LinearLayout>

    </LinearLayout>

    <Button
        android:id="@+id/child_del"
        android:layout_width="50dp"
        android:layout_height="match_parent"
        android:text="刪除"
        android:background="#f00"
        android:textColor="#fff"/>
</LinearLayout>

購物車適配器:

/**
 * Created by Administrator
 * 購物車的適配器
 */

public class CartAdapter extends BaseExpandableListAdapter{
    private Handler handler;
    private CartPresenter cartPresenter;
    private RelativeLayout progressBar;
    private Context context;
    private CartBean cartBean;
    private int childIndex;
    private int allIndex;

    public CartAdapter(Context context, CartBean cartBean, RelativeLayout progressBar, CartPresenter cartPresenter, Handler handler) {
        this.context = context;
        this.cartBean = cartBean;
        this.progressBar = progressBar;
        this.cartPresenter = cartPresenter;
        this.handler = handler;
    }

    /**
     * 返回int就是長度
     * 返回Object爲對象
     * 返回long爲參數
     * 返回Boolean都是true
     * @return
     */
    @Override
    public int getGroupCount() {
        return cartBean.getData().size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return cartBean.getData().get(groupPosition).getList().size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return cartBean.getData().get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return cartBean.getData().get(groupPosition).getList().get(childPosition);
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }


    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        final GroupHolder holder;
        if (convertView ==  null){
            holder = new GroupHolder();
            convertView = View.inflate(context,R.layout.group_item,null);
            //找控件
            holder.group_check = convertView.findViewById(R.id.group_check);
            holder.group_text = convertView.findViewById(R.id.group_text);
            convertView.setTag(holder);
        }else {
            holder = (GroupHolder) convertView.getTag();
        }
        //賦值
        final CartBean.DataBean groupBean = cartBean.getData().get(groupPosition);
        holder.group_text.setText(groupBean.getSellerName());//商家的名字
        holder.group_check.setChecked(groupBean.isGroupCheck());//設置點擊(自己在bean包裏添加的isGroupCheck())
        //商家的點擊事件
        holder.group_check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //點擊時先顯示progressBar
                progressBar.setVisibility(View.VISIBLE);

                //根據商家的狀態改變子條目的狀態  一個一個更新,更新完一個之後再執行下一個
                childIndex = 0;
                //根據集合中的數據和商家的點擊狀態
                upDataAllChildInGroup(groupBean,holder.group_check.isChecked());
            }
        });

        return convertView;
    }

    /**
     * 更細子條目的數據
     * @param groupBean
     * @param checked
     */
    private void upDataAllChildInGroup(final CartBean.DataBean groupBean, final boolean checked) {
        //先得到所有的子條目
        CartBean.DataBean.ListBean listBean = groupBean.getList().get(childIndex);

        Map<String, String> params = new HashMap<>();

        //因爲更新時所有的狀態都可能改變,就都放到map        params.put("uid", "2845");
        params.put("sellerid", String.valueOf(listBean.getSellerid()));
        params.put("pid", String.valueOf(listBean.getPid()));
        params.put("selected", String.valueOf(checked ? 1 : 0));//如果選中就是1,否則爲0(三元運算符)
        params.put("num", String.valueOf(listBean.getNum()));

        OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //更新成功一條
                if (response.isSuccessful()) {
                    //索引增加
                    childIndex++;
                    if (childIndex < groupBean.getList().size()) {
                        //再去更新下一條
                        upDataAllChildInGroup(groupBean, checked);

                    } else {//全都更新完成了....重新查詢購物車
                        cartPresenter.getData(Api.SELECTART_API);
                    }
                }

            }
        });
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        ChildHolder holder;
        if (convertView == null){
            holder = new ChildHolder();
            convertView = View.inflate(context,R.layout.child_item,null);
            //找控件
            holder.child_check = convertView.findViewById(R.id.child_check);
            holder.child_image = convertView.findViewById(R.id.child_image);
            holder.child_title = convertView.findViewById(R.id.child_title);
            holder.child_price = convertView.findViewById(R.id.child_price);
            holder.child_jian = convertView.findViewById(R.id.child_jian);
            holder.child_num = convertView.findViewById(R.id.child_num);
            holder.child_jia = convertView.findViewById(R.id.child_jia);
            holder.child_del = convertView.findViewById(R.id.child_del);
            convertView.setTag(holder);
        }else {
            holder = (ChildHolder) convertView.getTag();
        }
        //賦值
        final CartBean.DataBean.ListBean childBean = cartBean.getData().get(groupPosition).getList().get(childPosition);
        holder.child_check.setChecked(childBean.getSelected() == 0 ? false:true);
        holder.child_title.setText(childBean.getTitle());
        String[] split = childBean.getImages().split("\\|");
        Glide.with(context).load(split[0]).into(holder.child_image);
        holder.child_price.setText("¥:"+childBean.getPrice());
        holder.child_num.setText(childBean.getNum()+"");
        //CheckBox的點擊
        holder.child_check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //點擊時先顯示progressBar
                progressBar.setVisibility(View.VISIBLE);

                Map<String, String> params = new HashMap<>();

                params.put("uid", "2845");
                params.put("sellerid", String.valueOf(childBean.getSellerid()));
                params.put("pid", String.valueOf(childBean.getPid()));

                params.put("selected", String.valueOf(childBean.getSelected() == 0 ? 1 : 0));
                params.put("num", String.valueOf(childBean.getNum()));

                OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        //更新成功之後,,,,再次查詢購物車的數據進行展示
                        if (response.isSuccessful()) {
                            cartPresenter.getData(Api.SELECTART_API);
                        }
                    }
                });
            }
        });

        //加號的點擊
        holder.child_jia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int num = childBean.getNum();

                //此時需要顯示進度條
                progressBar.setVisibility(View.VISIBLE);
                //更新購物車,,,,需要改變是數量,,,,需要加1

                Map<String, String> params = new HashMap<>();

                //?uid=71&sellerid=1&pid=1&selected=0&num=10
                params.put("uid", "2845");
                params.put("sellerid", String.valueOf(childBean.getSellerid()));
                params.put("pid", String.valueOf(childBean.getPid()));
                params.put("selected", String.valueOf(childBean.getSelected()));

                params.put("num", String.valueOf(num + 1));

                OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        //更新成功之後,,,,再次查詢購物車的數據進行展示
                        if (response.isSuccessful()) {
                            cartPresenter.getData(Api.SELECTART_API);
                        }
                    }
                });
            }
        });

        //減號的點擊
        holder.child_jian.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //點擊加減時數據num也要改變
                int num = childBean.getNum();
                if (num == 1){//如果數據是1,就不能減了,不執行下面的邏輯
                    return;
                }

                //此時需要顯示進度條
                progressBar.setVisibility(View.VISIBLE);
                //更新購物車,,,,需要改變是數量,,,,需要加1

                Map<String, String> params = new HashMap<>();

                //?uid=71&sellerid=1&pid=1&selected=0&num=10
                params.put("uid", "2845");
                params.put("sellerid", String.valueOf(childBean.getSellerid()));
                params.put("pid", String.valueOf(childBean.getPid()));
                params.put("selected", String.valueOf(childBean.getSelected()));

                params.put("num", String.valueOf(num - 1));

                OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        //更新成功之後,,,,再次查詢購物車的數據進行展示
                        if (response.isSuccessful()) {
                            cartPresenter.getData(Api.SELECTART_API);
                        }
                    }
                });
            }
        });

        //刪除
        holder.child_del.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //顯示進度條
                progressBar.setVisibility(View.VISIBLE);
                //調用刪除的接口
                Map<String, String> params = new HashMap<>();

                //uid=72&pid=1
                params.put("uid", "2845");
                params.put("pid", String.valueOf(childBean.getPid()));

                OkHttp3Util.doPost(Api.DELETECART_API, params, new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {

                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        if (response.isSuccessful()) {
                            //再次請求購物車的數據
                            cartPresenter.getData(Api.SELECTART_API);

                        }
                    }
                });
            }
        });

        return convertView;
    }


    /**
     * 計算價錢和數量
     */
    public void sendPriceAndCount() {
        double price = 0;
        int count = 0;

        for (int i = 0; i < cartBean.getData().size(); i++) {
            List<CartBean.DataBean.ListBean> listBeans = cartBean.getData().get(i).getList();
            for (int j = 0; j < listBeans.size(); j++) {

                if (listBeans.get(j).getSelected() == 1) {
                    price += listBeans.get(j).getPrice() * listBeans.get(j).getNum();
                    count += listBeans.get(j).getNum();
                }
            }
        }

        //double高精度,,,計算的時候可能會出現一串數字...保留兩位
        DecimalFormat decimalFormat = new DecimalFormat("0.00");
        String priceString = decimalFormat.format(price);
        CountPriceBean countPriceBean = new CountPriceBean(priceString, count);

        //發送到主頁面進行顯示
        Message msg = Message.obtain();

        msg.what = 0;
        msg.obj = countPriceBean;
        handler.sendMessage(msg);
    }

    /**
     * 全選反選的操作
     * @param checked
     */
    public void setAllCheck(boolean checked) {
        //創建一個大的結合,,,存放所有商品的數據
        List<CartBean.DataBean.ListBean> allList = new ArrayList<>();
        for (int i = 0; i < cartBean.getData().size(); i++) {
            List<CartBean.DataBean.ListBean> listBeans = cartBean.getData().get(i).getList();
            for (int j = 0; j < listBeans.size(); j++) {
                allList.add(listBeans.get(j));
            }
        }

        //顯示progress
        progressBar.setVisibility(View.VISIBLE);

        //遞歸更新....
        allIndex = 0;
        upDateAllChecked(allList, checked);
    }

    /**
     * 更新選擇的操作
     * @param allList
     * @param checked
     */
    private void upDateAllChecked(final List<CartBean.DataBean.ListBean> allList, final boolean checked) {
        CartBean.DataBean.ListBean listBean = allList.get(allIndex);
        Map<String, String> params = new HashMap<>();

        //?uid=71&sellerid=1&pid=1&selected=0&num=10
        params.put("uid", "2845");
        params.put("sellerid", String.valueOf(listBean.getSellerid()));
        params.put("pid", String.valueOf(listBean.getPid()));

        params.put("selected", String.valueOf(checked ? 1 : 0));
        params.put("num", String.valueOf(listBean.getNum()));

        OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //更新一條成功
                if (response.isSuccessful()) {
                    allIndex++;

                    if (allIndex < allList.size()) {
                        //繼續更新下一條
                        upDateAllChecked(allList, checked);
                    } else {
                        //重新查詢
                        cartPresenter.getData(Api.SELECTART_API);
                    }

                }
            }
        });
    }

    public class GroupHolder{
        CheckBox group_check;
        TextView group_text;
   }
   public class ChildHolder{
        CheckBox child_check;
        ImageView child_image;
        TextView child_title;
        TextView child_price;
        TextView child_jian;
        TextView child_num;
        TextView child_jia;
        Button child_del;
   }
}
OK!到了這裏之後,我們要的效果就出來了,還行吧!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章