1. 程式人生 > >購物車一個Adaper,可以刪除,全選反選,數量加減

購物車一個Adaper,可以刪除,全選反選,數量加減

在這裡插入圖片描述
1activity_main.xml頁面佈局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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=".activity.MainActivity">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycle_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/text_jiesuan"
        />
        <CheckBox
            android:id="@+id/query"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toBottomOf="@id/recycle_view"
            app:layout_constraintBottom_toBottomOf="parent"
            />
    <TextView
        android:id="@+id/text_query"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toRightOf="@id/query"
        app:layout_constraintBottom_toBottomOf="@id/query"
        app:layout_constraintTop_toTopOf="@id/query"
        android:textSize="20sp"
        android:text="全選/反選"
        />
    <TextView
        android:id="@+id/text_total"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/recycle_view"
        app:layout_constraintLeft_toRightOf="@id/text_query"
        android:layout_marginLeft="10dp"
        android:text="總價:¥0元"
        android:textColor="#f00"
        android:textSize="18sp"
        />
    <TextView
        android:id="@+id/text_shopp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/text_total"
        app:layout_constraintLeft_toRightOf="@id/text_query"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginLeft="10dp"
        android:text="共0件商品"
        android:textSize="18sp"
        />
    <TextView
        android:id="@+id/text_jiesuan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/recycle_view"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:text="去結算"
        android:textSize="26sp"
        android:background="@drawable/button_shape"
        android:gravity="center"
        />
</android.support.constraint.ConstraintLayout>

2自定義加減器佈局

<?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="match_parent"
    android:orientation="horizontal"
    >
    <ImageButton
        android:id="@+id/jian"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/ic_jian_name"
        />
    <EditText
        android:id="@+id/ed_num"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:text="1"
        android:textSize="24sp"
        android:inputType="number"
        android:background="@drawable/edit_shape"
        />
    <ImageButton
        android:id="@+id/add"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/ic_add_name"
        />
</LinearLayout>

3.子條目佈局

<?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="vertical"
    android:padding="15dp"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
        <CheckBox
            android:id="@+id/shop_check"
            android:layout_width="50dp"
            android:layout_height="50dp" />
        <TextView
            android:id="@+id/shopp_commodity"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:text="shopp_commodity"
            android:textSize="24sp"
            />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center_vertical"
        >
        <CheckBox
            android:id="@+id/item_check"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ImageView
            android:id="@+id/item_image"
            android:layout_width="120dp"
            android:layout_height="120dp"
            android:src="@mipmap/ic_launcher"
            />
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginLeft="10dp"
            android:orientation="vertical"
            android:layout_weight="1"
            >
            <TextView
                android:id="@+id/item_name"
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:textSize="18sp"
                android:text="name"
                android:maxLines="2"
                />
            <TextView
                android:id="@+id/item_price"
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:textSize="18sp"
                android:text="price"
                android:textColor="#f00"
                />
            <com.example.shoppingcart01.custom.CustomView
                android:id="@+id/custom"
                android:layout_width="wrap_content"
                android:layout_height="0dp"
                android:layout_weight="1"
                />
        </LinearLayout>
        <ImageView
            android:id="@+id/item_del"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_marginRight="10dp"
            android:src="@drawable/ic_del_name"
            />
    </LinearLayout>
</LinearLayout>

4.兩個shape頁面
4.1加減器shape

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="10dp"/>
    <solid android:color="#fff"/>
    <size android:height="45dp" android:width="45dp"/>
</shape>

4.2button的shape

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="200dp"/>
    <solid android:color="#0ff"/>
    <size android:width="130dp" android:height="60dp"/>
</shape>

5.Bean類 裡面需要自己寫三個屬性程式碼中有註釋

package com.example.shoppingcart01.bean;

import java.util.List;

public class ShoppBean {


    private String msg;
    private String code;
    private List<DataBean> data;
    private final String SUCCESS_CODE="0";
    public boolean isSuccess(){
        return code.equals(SUCCESS_CODE);
    }
    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {

        private String sellerName;
        private String sellerid;
        private List<ListBean> list;

        public String getSellerName() {
            return sellerName;
        }

        public void setSellerName(String sellerName) {
            this.sellerName = sellerName;
        }

        public String getSellerid() {
            return sellerid;
        }

        public void setSellerid(String sellerid) {
            this.sellerid = sellerid;
        }

        public List<ListBean> getList() {
            return list;
        }

        public void setList(List<ListBean> list) {
            this.list = list;
        }

        public static class ListBean {

            private double bargainPrice;
            private String createtime;
            private String detailUrl;
            private String images;
            private int num;
            private int pid;
            private double price;
            private int pscid;
            private int selected;
            private int sellerid;
            private String subhead;
            private String title;
            //1為顯示商鋪, 2為隱藏商鋪
            private int isFirst = 1;
            //每個商品的選中狀態
            private boolean item_check;
            //商店的選中狀態
            private boolean shop_check;

            public int getIsFirst() {
                return isFirst;
            }

            public void setIsFirst(int isFirst) {
                this.isFirst = isFirst;
            }

            public boolean isItem_check() {
                return item_check;
            }

            public void setItem_check(boolean item_check) {
                this.item_check = item_check;
            }

            public boolean isShop_check() {
                return shop_check;
            }

            public void setShop_check(boolean shop_check) {
                this.shop_check = shop_check;
            }

            public double getBargainPrice() {
                return bargainPrice;
            }

            public void setBargainPrice(double bargainPrice) {
                this.bargainPrice = bargainPrice;
            }

            public String getCreatetime() {
                return createtime;
            }

            public void setCreatetime(String createtime) {
                this.createtime = createtime;
            }

            public String getDetailUrl() {
                return detailUrl;
            }

            public void setDetailUrl(String detailUrl) {
                this.detailUrl = detailUrl;
            }

            public String getImages() {
                return images;
            }

            public void setImages(String images) {
                this.images = images;
            }

            public int getNum() {
                return num;
            }

            public void setNum(int num) {
                this.num = num;
            }

            public int getPid() {
                return pid;
            }

            public void setPid(int pid) {
                this.pid = pid;
            }

            public double getPrice() {
                return price;
            }

            public void setPrice(double price) {
                this.price = price;
            }

            public int getPscid() {
                return pscid;
            }

            public void setPscid(int pscid) {
                this.pscid = pscid;
            }

            public int getSelected() {
                return selected;
            }

            public void setSelected(int selected) {
                this.selected = selected;
            }

            public int getSellerid() {
                return sellerid;
            }

            public void setSellerid(int sellerid) {
                this.sellerid = sellerid;
            }

            public String getSubhead() {
                return subhead;
            }

            public void setSubhead(String subhead) {
                this.subhead = subhead;
            }

            public String getTitle() {
                return title;
            }

            public void setTitle(String title) {
                this.title = title;
            }
        }
    }
}

6.自定義加減器的view

package com.example.shoppingcart01.custom;

import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;

import com.example.shoppingcart01.R;

public class CustomView extends LinearLayout {

    private ImageButton jian;
    private ImageButton add;
    private EditText editText;
    private int mCount = 1;
    public CustomView(Context context) {
        super(context);
    }

    public CustomView(Context context,  AttributeSet attrs) {
        super(context, attrs);
        View view = View.inflate(context,R.layout.custom_item,this);
        jian = view.findViewById(R.id.jian);
        add = view.findViewById(R.id.add);
        editText = view.findViewById(R.id.ed_num);
        //減
        jian.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                String content = editText.getText().toString().trim();
                Integer count = Integer.valueOf(content);
                if(count>1){
                    mCount = count-1;
                    editText.setText(mCount+"");
                    //回撥給adapter裡面
                    if(customListener!=null){
                        customListener.jianjian(mCount);
                    }
                }
            }
        });
        //加
        add.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                String content = editText.getText().toString().trim();
                Integer count = Integer.valueOf(content)+1;
                mCount = count;
                editText.setText(mCount+"");
                //回撥給adapter裡面
                if(customListener!=null){
                    customListener.jianjian(mCount);
                }
            }
        });
        //輸入框
        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //TODO
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
    }

    private CustomListener customListener;
    public void setCustomListener(CustomListener customListener){
        this.customListener = customListener;
    }
    //定義介面加減
    public interface CustomListener{
        void jianjian(int count);
        void shuruzhi(int count);
    }
    //這個方法共adaper設定數量時呼叫
    public void setEditText(int num){
        if(editText!=null){
            editText.setText(num+"");
        }
    }
}

7.介面卡頁面(這裡操作的任務比較多)

package com.example.shoppingcart01.adaper;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.example.shoppingcart01.R;
import com.example.shoppingcart01.bean.ShoppBean;
import com.example.shoppingcart01.custom.CustomView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Handler;

public class ShopAdaper extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context mContext;
    private List<ShoppBean.DataBean.ListBean> list;
    //存放商家id和商家名稱的map集合
    private Map<String,String> map = new HashMap<>();

    public ShopAdaper(Context mContext) {
        this.mContext = mContext;
    }
    /**
     * 新增資料並更新顯示
     * */
    public void add(ShoppBean shoppBean){
        //傳進來的是bean物件
        if(list == null){
            list = new ArrayList<>();
        }
        //第一層遍歷商家和商品
        for(ShoppBean.DataBean bean:shoppBean.getData()){
            //把商品的id和商品的名稱新增到map集合裡 ,,為了之後方便呼叫
            map.put(bean.getSellerid(),bean.getSellerName());
            //第二層遍歷裡面的商品
            for(int i = 0;i<bean.getList().size();i++){
                //新增到list集合裡
                list.add(bean.getList().get(i));
            }
        }
        //呼叫方法 設定顯示或隱藏 商鋪名
        setFirst(list);
        notifyDataSetChanged();
    }
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.shopp_item,viewGroup,false);
        MyViewHolder viewHolder = new MyViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int i) {
        /**
         * 設定商鋪的 shop_checkbox和商鋪的名字 顯示或隱藏
         * */
        final MyViewHolder holder = (MyViewHolder) viewHolder;
        if(list.get(i).getIsFirst() == 1){
            //顯示商家
            holder.shop_check.setVisibility(View.VISIBLE);
            holder.shopp_commodity.setVisibility(View.VISIBLE);
            //設定選中狀態
            holder.shop_check.setChecked(list.get(i).isShop_check());
            holder.shopp_commodity.setText(map.get(String.valueOf(list.get(i).getSellerid())));
        }else{
            //隱藏
            holder.shop_check.setVisibility(View.GONE);
            holder.shopp_commodity.setVisibility(View.GONE);
        }
        //拆分images欄位
        String[] str = list.get(i).getImages().split("\\|");
        //設定商品的圖片
        Glide.with(mContext).load(str[0]).into(holder.item_image);
        //控制商品的checkbox,根據欄位改變
        holder.item_check.setChecked(list.get(i).isItem_check());
        holder.item_name.setText(list.get(i).getTitle());
        holder.item_price.setText(list.get(i).getPrice()+"");
        //呼叫customview裡的方法設定加減號中間的數字
        holder.custom.setEditText(list.get(i).getNum());
        //商鋪的shop_checkbox點選事件 ,控制商品的item_checkbox
        holder.shop_check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //先改變資料來源中的shop_check
                list.get(i).setShop_check(holder.shop_check.isChecked());
                for(int a = 0;a<list.size();a++){
                    //如果是同一家商鋪的 都給成相同狀態
                    if(list.get(i).getSellerid() == list.get(a).getSellerid()){
                        //當前條目的選中狀態 設定成 當前商鋪的選中狀態
                        list.get(a).setItem_check(holder.shop_check.isChecked());
                    }
                }
                //重新整理介面卡
                notifyDataSetChanged();
                //呼叫求和的方法
                sum(list);
            }
        });
        //商品的item_checkbox點選事件,控制商鋪的shop_checkbox
        holder.item_check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //先改變資料來源中的item_checkbox
                list.get(i).setItem_check(holder.item_check.isChecked());
                //反向控制商鋪的shop_checkbox
                for(int s = 0;s<list.size();s++){
                    for(int j = 0;j<list.size();j++){
                        //如果兩個商品是同一家店鋪的 並且 這兩個商品的item_checkbox選中狀態不一樣
                        if(list.get(s).getSellerid() == list.get(j).getSellerid()&&!list.get(j).isItem_check()){
                            //就把商鋪的shop_checkbox改成false
                            list.get(s).setShop_check(false);
                            break;
                        }else{
                            //同一家商鋪的商品 選中狀態都一樣,就把商鋪shop_checkbox狀態改成true
                            list.get(s).setShop_check(true);
                        }
                    }
                }
                //更新介面卡
                notifyDataSetChanged();
                //呼叫求和的方法
                sum(list);
            }
        });
        //刪除條目的點選事件
        holder.item_del.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //移除集合中的當前資料
                list.remove(i);
                //刪除完當前的條目 重新判斷商鋪的顯示隱藏
                setFirst(list);
                //呼叫重新求和
                sum(list);
                notifyDataSetChanged();
            }
        });
        //加減號的監聽,
        holder.custom.setCustomListener(new CustomView.CustomListener() {
            @Override
            public void jianjian(int count) {
                //改變資料來源中的數量
                list.get(i).setNum(count);
                notifyDataSetChanged();
                sum(list);
            }
            //輸入值 求總價
            @Override
            public void shuruzhi(int count) {
                list.get(i).setNum(count);
                notifyDataSetChanged();
                sum(list);
            }
        });
    }
    /**
     * 設定資料來源,控制是否顯示商家
     * */
    private void setFirst(List<ShoppBean.DataBean.ListBean> list) {
        if(list.size()>0){
            //如果是第一條資料就設定isFirst為1
            list.get(0).setIsFirst(1);
            //從第二條開始遍歷
            for(int i=1;i<list.size();i++){
                //如果和前一個商品是同一家商店的
                if(list.get(i).getSellerid() == list.get(i-1).getSellerid()){
                    //設定成2不顯示商鋪
                    list.get(i).setIsFirst(2);
                }else{
                    //設定成1顯示商鋪
                    list.get(i).setIsFirst(1);
                    //如果當前條目選中,把當前的商鋪也選中
                    if(list.get(i).isItem_check() == true){
                        list.get(i).setShop_check(list.get(i).isItem_check());
                    }
                }
            }
        }
    }
    //求和的方法
    private void sum(List<ShoppBean.DataBean.ListBean> list) {
        //初始的總價為0
            int totalNum = 0;
            double totalPrice = 0.0;
            boolean allCheck = true;
            for(int i = 0;i<list.size();i++){
                //把 已經選中的 條目 計算價格
                if(list.get(i).isItem_check()){
                    totalNum += list.get(i).getNum();
                    totalPrice+= list.get(i).getNum()*list.get(i).getPrice();
                }else{
                    //如果有個未選中,就標記為false
                    allCheck = false;
                }
            }
        //介面回調出去 把總價 總數量 和allcheck 傳給view層
        updateListener.setTotal(totalPrice+"",totalNum+"",allCheck);
    }
    //view層呼叫這個方法, 點選quanxuan按鈕的操作
    public void queryAll(boolean checked){
        for(int i = 0;i<list.size();i++){
            list.get(i).setShop_check(checked);
            list.get(i).setItem_check(checked);
        }
        notifyDataSetChanged();
        sum(list);
    }
    @Override
    public int getItemCount() {
        return list==null?0:list.size();
    }
    public class MyViewHolder extends RecyclerView.ViewHolder{
        public final CheckBox shop_check;
        public final TextView shopp_commodity;
        public final CheckBox item_check;
        public final ImageView item_image;
        public final TextView item_name;
        public final TextView item_price;
        public final CustomView custom;
        public final ImageView item_del;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            shop_check = itemView.findViewById(R.id.shop_check);
            shopp_commodity = itemView.findViewById(R.id.shopp_commodity);
            item_check = itemView.findViewById(R.id.item_check);
            item_image = itemView.findViewById(R.id.item_image);
            item_name = itemView.findViewById(R.id.item_name);
            item_price = itemView.findViewById(R.id.item_price);
            custom = itemView.findViewById(R.id.custom);
            item_del = itemView.findViewById(R.id.item_del);
        }
    }

    private UpdateListener updateListener;
    public void setUpdateListener(UpdateListener updateListener){
        this.updateListener = updateListener;
    }
    //定義介面
    public interface UpdateListener{
        void setTotal(String total,String num,boolean allCheck);
    }
}

8.MainActivity頁面

package com.example.shoppingcart01.activity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.OrientationHelper;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;
import android.widget.Toast;

import com.example.shoppingcart01.R;
import com.example.shoppingcart01.adaper.ShopAdaper;
import com.example.shoppingcart01.apis.Apis;
import com.example.shoppingcart01.bean.ShoppBean;
import com.example.shoppingcart01.presenter.PresenterImpl;
import com.example.shoppingcart01.view.Iview;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity implements Iview {

    private PresenterImpl presenter;
    private RecyclerView recyclerView;
    private CheckBox query;
    private TextView text_total;
    private TextView text_shopp;
    private ShopAdaper adaper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        presenter = new PresenterImpl(this);
        initView();
    }

    private void initView() {
        //獲取資源id
        recyclerView = findViewById(R.id.recycle_view);
        query = findViewById(R.id.query);
        text_total = findViewById(R.id.text_total);
        text_shopp = findViewById(R.id.text_shopp);
        //1為不選中
        query.setTag(1);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(OrientationHelper.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);
        //建立介面卡
        adaper = new ShopAdaper(this);
        recyclerView.setAdapter(adaper);
        //呼叫介面卡裡的介面
        adaper.setUpdateListener(new ShopAdaper.UpdateListener() {
            @Override
            public void setTotal(String total, String num, boolean allCheck) {
                //設定ui的改變
                text_shopp.setText("共"+num+"件商品");
                text_total.setText("總價:¥"+total+"元");
                if(allCheck){
                    query.setTag(2);
                }else{
                    query.setTag(1);
                }
                query.setChecked(allCheck);
            }
        });
        //這裡只做ui更改, 點選全選按鈕,,調到adapter裡面操作
        query.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //呼叫adapter裡面的方法 ,,把當前quanxuan狀態傳遞過去
                int tag = (int) query.getTag();
                if(tag == 1){
                    query.setTag(2);
                }else{
                    query.setTag(1);
                }
                adaper.queryAll(query.isChecked());
            }
        });
        //請求網址
        Map<String,String> map = new HashMap<>();
        map.put("uid","71");
        presenter.startRequest(Apis.URL_SHOPP_CART,map,ShoppBean.class);
    }

    @Override
    public void requestData(Object o) {
        if(o instanceof ShoppBean){
            ShoppBean bean = (ShoppBean) o;
            if(bean==null || !bean.isSuccess()){
                Toast.makeText(MainActivity.this,bean.getMsg(),Toast.LENGTH_SHORT).show();
            }else{
                adaper.add(bean);
            }
        }
    }

    @Override
    public void requestFail(Object o) {
        if(o instanceof Exception){
            Exception e = (Exception) o;
            e.printStackTrace();
        }
        Toast.makeText(MainActivity.this,"網路請求錯誤",Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.onDetach();
    }
}

詳細程式碼 請訪問一下連結
https://github.com/guoxinyu1995/yuekao/tree/master/shoppingcart01