电商项目购物车页面

1.查询购物车的p层

package com.example.jingdong.presenter;

import com.example.jingdong.bean.SellerBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.model.GetShopCarModelImp;
import com.example.jingdong.net.OnNetListener;
import com.example.jingdong.ui.inter.GetShopCarView;
import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.List;

public class GetShopCarPresenterImp implements GetShopCarPresenter{

    private GetShopCarView getShopCarView;
    private final GetShopCarModelImp getShopCarModelImp;

    public GetShopCarPresenterImp(GetShopCarView getShopCarView) {
        this.getShopCarView=getShopCarView;
        getShopCarModelImp = new GetShopCarModelImp();
    }

    @Override
    public void getShopCar(String uid, String token) {
        getShopCarModelImp.getShopCar(uid, token, new OnNetListener() {
            @Override
            public void onSuccess(String result) {

                ShopCarBean shopCarBean = new Gson().fromJson(result, ShopCarBean.class);

                if (getShopCarView!=null){
                    //用于封装一级列表
                    List<SellerBean> groupList = new ArrayList<>();
                    //用于封装二级列表
                    List<List<ShopCarBean.DataBean.ListBean>> childList = new ArrayList<>();
                    //获取数据
                    List<ShopCarBean.DataBean> data = shopCarBean.getData();
                    //循环获取数据
                    for (int i = 0; i < data.size(); i++) {
                        ShopCarBean.DataBean dataBean = data.get(i);
                        //添加父集合
                        SellerBean sellerBean = new SellerBean();
                        sellerBean.setSellerName(dataBean.getSellerName());
                        sellerBean.setSellerid(dataBean.getSellerid());
                        //设置是否全部选中
                        sellerBean.setSelected(isSellerProductAllSeleect(dataBean));
                        groupList.add(sellerBean);
                        //添加子集合
                        childList.add(data.get(i).getList());
                    }
                    //展示数据
                    getShopCarView.showShopCar(groupList,childList);
                }
            }

            @Override
            public void onFailed(Exception e) {

            }
        });
    }

    //判断该商家下面的商品是否全选
    private boolean isSellerProductAllSeleect(ShopCarBean.DataBean dataBean){
        //获取该商家下的所有商品
        List<ShopCarBean.DataBean.ListBean> list = dataBean.getList();
        for (int i = 0; i < list.size(); i++) {
            ShopCarBean.DataBean.ListBean listBean = list.get(i);
            if (0==listBean.getSelected()){
                return false;
            }
        }
        return true;
    }

    @Override
    public void detach() {
        if (getShopCarView!=null){
            getShopCarView=null;
        }
    }
}

2.购物车activity页面

package com.example.jingdong.ui.activity;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;

import com.example.jingdong.R;
import com.example.jingdong.bean.SellerBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.presenter.GetShopCarPresenterImp;
import com.example.jingdong.ui.adapter.ElvShopCarAdapter;
import com.example.jingdong.ui.inter.GetShopCarView;
import com.example.jingdong.util.DialogUtil;
import com.example.jingdong.util.SpUtil;

import java.util.List;

public class ShopCarActivity extends AppCompatActivity implements GetShopCarView {

    private GetShopCarPresenterImp getShopCarPresenterImp;
    private ExpandableListView elv_shopcar;
    private ProgressDialog progressDialog;
    private ElvShopCarAdapter elvShopCarAdapter;
    private TextView tv_money;
    private TextView tv_total;
    /**
     * 全选
     */
    private CheckBox ck_all;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shop_car);
        initView();
        //找控件
        elv_shopcar = findViewById(R.id.elv_shopcar);
        tv_money = findViewById(R.id.tv_Money);
        tv_total = findViewById(R.id.tv_Total);
        progressDialog = DialogUtil.getProgressDialog(this);
        //绑定
        getShopCarPresenterImp = new GetShopCarPresenterImp(this);
        getShopCarPresenterImp.getShopCar(SpUtil.getString(ShopCarActivity.this, "uid", ""), SpUtil.getString(ShopCarActivity.this, "token", ""));
    }

    private void initView() {
        ck_all = (CheckBox) findViewById(R.id.ck_all);
        //点击全选按钮的监听
        ck_all.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (elvShopCarAdapter!=null){
                    progressDialog.show();
                    elvShopCarAdapter.changeAllState(ck_all.isChecked());
                }
            }
        });
    }

    //显示数据
    @Override
    public void showShopCar(List<SellerBean> groupList, List<List<ShopCarBean.DataBean.ListBean>> childList) {
        //判断所有商家是否全部选中
        ck_all.setChecked(isSellerAllSelected(groupList));
        //设置适配器
        elvShopCarAdapter = new ElvShopCarAdapter(groupList, childList, ShopCarActivity.this, getShopCarPresenterImp, progressDialog);
        elv_shopcar.setAdapter(elvShopCarAdapter);

        //获取商品总价和数量
        String[] strings = elvShopCarAdapter.computeMoneyAndNum();
        tv_money.setText("总计:" + strings[0] + "元");
        tv_total.setText("去结算" + strings[1] + "个");

        //默认全部展开
        for (int i = 0; i < groupList.size(); i++) {
            elv_shopcar.expandGroup(i);
        }

        //关闭进度条
        progressDialog.dismiss();
    }

    private boolean isSellerAllSelected(List<SellerBean> groupList){
        for (int i = 0; i < groupList.size(); i++) {
            SellerBean sellerBean = groupList.get(i);
            if (!sellerBean.isSelected()){
                return false;
            }
        }
        return true;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getShopCarPresenterImp.detach();
    }

}

3.购物车expandablelistview的适配器

package com.example.jingdong.ui.adapter;

import android.app.ProgressDialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.example.jingdong.R;
import com.example.jingdong.bean.SellerBean;
import com.example.jingdong.bean.ShopCarBean;
import com.example.jingdong.presenter.DeleteCarPresenterImp;
import com.example.jingdong.presenter.GetShopCarPresenterImp;
import com.example.jingdong.presenter.UpdateCarPresenterImp;
import com.example.jingdong.ui.inter.AddCarView;
import com.example.jingdong.ui.inter.DeleteCarView;
import com.example.jingdong.ui.inter.UpdateCarView;
import com.example.jingdong.ui.view.AddSubView;
import com.example.jingdong.util.SpUtil;

import java.util.List;

public class ElvShopCarAdapter extends BaseExpandableListAdapter implements UpdateCarView, DeleteCarView {

    private List<SellerBean> groupList;
    private List<List<ShopCarBean.DataBean.ListBean>> childList;
    private Context context;
    private GetShopCarPresenterImp getShopCarPresenterImp;
    private final LayoutInflater inflater;
    private final UpdateCarPresenterImp updateCarPresenterImp;
    private ProgressDialog progressDialog;
    private int productIndex;
    private int groupPosition;
    private static final int GETCARS = 0;//查询购物车
    private static final int UPDATE_PRODUCT = 1;//更新商品
    private static final int UPDATE_SELLER = 2;//更新卖家
    private static int state = GETCARS;
    private final String uid;
    private final String token;
    private boolean checked;
    private boolean allChecked;
    private final DeleteCarPresenterImp deleteCarPresenterImp;

    public ElvShopCarAdapter(List<SellerBean> groupList, List<List<ShopCarBean.DataBean.ListBean>> childList, Context context,
                             GetShopCarPresenterImp getShopCarPresenterImp, ProgressDialog progressDialog) {
        this.groupList = groupList;
        this.childList = childList;
        this.context = context;
        this.getShopCarPresenterImp = getShopCarPresenterImp;
        this.progressDialog = progressDialog;
        inflater = LayoutInflater.from(context);
        //获取uid和token
        uid = SpUtil.getString(context, "uid", "");
        token = SpUtil.getString(context, "token", "");
        //绑定更新
        updateCarPresenterImp = new UpdateCarPresenterImp(this);
        //绑定删除
        deleteCarPresenterImp = new DeleteCarPresenterImp(this);
    }

    @Override
    public int getGroupCount() {
        return groupList.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return childList.get(groupPosition).size();
    }

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

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return childList.get(groupPosition).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 View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        final GroupViewHolder groupViewHolder;
        if (convertView == null) {
            convertView = View.inflate(context, R.layout.elv_shopcarseller_item, null);
            groupViewHolder = new GroupViewHolder(convertView);
            convertView.setTag(groupViewHolder);
        } else {
            groupViewHolder = (GroupViewHolder) convertView.getTag();
        }
        //设置是否全部选中
        groupViewHolder.ck_seller.setChecked(groupList.get(groupPosition).isSelected());
        //设置数据
        groupViewHolder.tv_sellername.setText(groupList.get(groupPosition).getSellerName());

        //给商家的CheckBox设置点击事件
        groupViewHolder.ck_seller.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                state = UPDATE_PRODUCT;
                //显示进度条
                progressDialog.show();
                //默认从第一个商品开始更新购物车状态
                productIndex = 0;
                //全局记录一下当前更新的商家
                ElvShopCarAdapter.this.groupPosition = groupPosition;
                //该商家是否选中
                checked = groupViewHolder.ck_seller.isChecked();
                //更新商家下的商品状态
                updateProductInSeller();
            }
        });
        return convertView;
    }

    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        final ChildViewHolder childViewHolder;
        if (convertView == null) {
            convertView = View.inflate(context, R.layout.elv_shopcarsellerpro_item, null);
            childViewHolder = new ChildViewHolder(convertView);
            convertView.setTag(childViewHolder);
        } else {
            childViewHolder = (ChildViewHolder) convertView.getTag();
        }
        //获取单个子商品
        final ShopCarBean.DataBean.ListBean listBean = childList.get(groupPosition).get(childPosition);
        //根据服务器返回的select值,给CheckBox设置是否选中
        childViewHolder.ck_product.setChecked(listBean.getSelected() == 1 ? true : false);
        //设置数据
        childViewHolder.tv_producttitle.setText(listBean.getTitle());
        childViewHolder.tv_productprice.setText("¥" + listBean.getPrice() + "");
        Glide.with(context).load(listBean.getImages().split("\\|")[0]).into(childViewHolder.img_product);
        //设置数量
        childViewHolder.addsubcar.setNum(listBean.getNum() + "");
        //给子条目的CheckBox设置点击事件
        childViewHolder.ck_product.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressDialog.show();
                state = GETCARS;
                ElvShopCarAdapter.this.groupPosition = groupPosition;
                //获取sellerid
                String sellerid = groupList.get(groupPosition).getSellerid();
                //获取pid
                String pid = listBean.getPid() + "";
                String num = listBean.getNum() + "";
                //是否选中
                boolean childChecked = childViewHolder.ck_product.isChecked();
                //更新购物车
                updateCarPresenterImp.updateCar(uid, sellerid, pid, num, childChecked ? "1" : "0", token);
            }
        });

        //给加号设置点击事件
        childViewHolder.addsubcar.setAddOnclickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressDialog.show();
                state = GETCARS;
                //获取sellerid
                String sellerid = groupList.get(groupPosition).getSellerid();
                //获取pid
                int pid = listBean.getPid();
                //获取数量
                int num = listBean.getNum();
                num++;
                //是否选中
                String isChecked = childViewHolder.ck_product.isChecked() ? "1" : "0";
                //调用更新购物车的接口
                updateCarPresenterImp.updateCar(uid, sellerid, pid + "", num + "", isChecked, token);
            }
        });

        //给减号设置点击事件
        childViewHolder.addsubcar.setSubOnclickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressDialog.show();
                state = GETCARS;
                //获取当前商品的数量
                int num = listBean.getNum();
                if (num <= 1) {
                    progressDialog.dismiss();
                    Toast.makeText(context, "数量不能小于1!", Toast.LENGTH_SHORT).show();
                } else {
                    num--;
                    //获取sellerid
                    String sellerid = groupList.get(groupPosition).getSellerid();
                    //获取pid
                    String pid = listBean.getPid() + "";
                    //是否选中
                    String isChecked = childViewHolder.ck_product.isChecked() ? "1" : "0";
                    //更新服务器上购物车状态
                    updateCarPresenterImp.updateCar(uid, sellerid, pid, num + "", isChecked, token);
                }
            }
        });

        //给删除设置点击事件
        childViewHolder.tv_del.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressDialog.show();
                state = GETCARS;
                //获取商品的pid
                int pid = listBean.getPid();
                //开始删除购物车里的选项
                deleteCarPresenterImp.deleteCar(uid, pid + "", token);
            }
        });

        return convertView;
    }

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


    //父控件的viewholder
    public static class GroupViewHolder {
        public View rootView;
        public CheckBox ck_seller;
        public TextView tv_sellername;

        public GroupViewHolder(View rootView) {
            this.rootView = rootView;
            this.ck_seller = (CheckBox) rootView.findViewById(R.id.ck_seller);
            this.tv_sellername = (TextView) rootView.findViewById(R.id.tv_sellername);
        }
    }

    //子控件的viewholder
    public static class ChildViewHolder {
        public View rootView;
        public CheckBox ck_product;
        public TextView tv_del;
        public ImageView img_product;
        public TextView tv_producttitle;
        public TextView tv_productprice;
        public AddSubView addsubcar;

        public ChildViewHolder(View rootView) {
            this.rootView = rootView;
            this.ck_product = (CheckBox) rootView.findViewById(R.id.ck_product);
            this.tv_del = (TextView) rootView.findViewById(R.id.tv_del);
            this.img_product = (ImageView) rootView.findViewById(R.id.img_product);
            this.tv_producttitle = (TextView) rootView.findViewById(R.id.tv_producttitle);
            this.tv_productprice = (TextView) rootView.findViewById(R.id.tv_productprice);
            this.addsubcar = (AddSubView) rootView.findViewById(R.id.addsubcar);
        }

    }

    //更新购物车成功的回调
    @Override
    public void updateSuccess() {
        switch (state) {
            case GETCARS:
                //更新成功后调用查询购物车接口
                productIndex = 0;
                groupPosition = 0;
                getShopCarPresenterImp.getShopCar(uid, token);
                break;
            case UPDATE_PRODUCT:
                //更新成功一个商品以后,再接着更新该商家下的其他商品,直到没有商品为止
                productIndex++;
                //判断下标是否越界
                if (productIndex < childList.get(groupPosition).size()) {
                    //可以继续更新商品
                    updateProductInSeller();
                } else {
                    //商品已经全部更新完查询购物车
                    state = GETCARS;
                    updateSuccess();
                }
                break;
            case UPDATE_SELLER:
                //遍历所有商家下的商品,并更新状态
                productIndex++;
                //下标是否越界
                if (productIndex<childList.get(groupPosition).size()){
                    //可以继续更新商品
                    updateProductInSeller(allChecked);
                }else {
                    //第一个商家的商品已经全部更新完,请查询购物车
                    productIndex=0;
                    groupPosition++;
                    if (groupPosition<groupList.size()){
                        //可以继续更新商品
                        updateProductInSeller(allChecked);
                    }else {
                        //所有商家的所有商品已经全部更新完,查询购物车
                        state=GETCARS;
                        updateSuccess();
                    }
                }
                break;
        }
    }

    //删除购物车成功的回调
    @Override
    public void delSuccess() {
        //查询购物车
        getShopCarPresenterImp.getShopCar(uid, token);
    }

    //更新商家下的商品状态
    private void updateProductInSeller() {
        //获取sellerid
        SellerBean sellerBean = groupList.get(groupPosition);
        String sellerid = sellerBean.getSellerid();
        //获取pid
        ShopCarBean.DataBean.ListBean listBean = childList.get(groupPosition).get(productIndex);
        int pid = listBean.getPid();
        int num = listBean.getNum();
        //开始更新
        updateCarPresenterImp.updateCar(uid, sellerid, pid + "", num + "", checked ? "1" : "0", token);
    }

    private void updateProductInSeller(boolean bool) {
        //获取sellerid
        SellerBean sellerBean = groupList.get(groupPosition);
        String sellerid = sellerBean.getSellerid();
        //获取pid
        ShopCarBean.DataBean.ListBean listBean = childList.get(groupPosition).get(productIndex);
        int pid = listBean.getPid();
        int num = listBean.getNum();
        //开始更新
        updateCarPresenterImp.updateCar(uid, sellerid, pid + "", num + "", bool ? "1" : "0", token);
    }

    //计算数量和价钱
    public String[] computeMoneyAndNum() {
        double sum = 0;
        int num = 0;
        for (int i = 0; i < groupList.size(); i++) {
            for (int j = 0; j < childList.get(i).size(); j++) {
                //判断商品是否选中
                ShopCarBean.DataBean.ListBean listBean = childList.get(i).get(j);
                if (listBean.getSelected() == 1) {
                    //该商品为选中状态
                    sum += listBean.getPrice() * listBean.getNum();
                    num += listBean.getNum();
                }
            }
        }
        return new String[]{sum + "", num + ""};
    }

    //全选复选框更新状态
    public void changeAllState(boolean bool) {
        this.allChecked = bool;
        state = UPDATE_SELLER;
        //遍历商家下的商品修改状态
        updateProductInSeller(bool);
    }

}

4.自定义加减器页面

package com.example.jingdong.ui.view;

import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.example.jingdong.R;

public class AddSubView extends LinearLayout {
    private TextView tv_productSub;
    private TextView tv_productNum;
    private TextView tv_productAdd;

    public AddSubView(Context context) {
        this(context, null);
    }

    public AddSubView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        View view = LayoutInflater.from(context).inflate(R.layout.add_sub_view, this);
        tv_productSub=view.findViewById(R.id.tv_productSub);
        tv_productNum=view.findViewById(R.id.tv_productNum);
        tv_productAdd=view.findViewById(R.id.tv_productAdd);
    }

    public String getNum() {
        return tv_productNum.getText().toString();
    }

    public void setNum(String str) {
        tv_productNum.setText(str);
    }

    //给加号设置点击事件
    public void setAddOnclickListener(OnClickListener onclickListener){
        tv_productAdd.setOnClickListener(onclickListener);
    }

    //给减号设置点击事件
    public void setSubOnclickListener(OnClickListener onclickListener){
        tv_productSub.setOnClickListener(onclickListener);
    }
}

5.自定义加减器布局页面

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/tv_productSub"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/cart_biankuang"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:text="-"
        android:textSize="12sp" />

    <TextView
        android:id="@+id/tv_productNum"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/cart_biankuang"
        android:paddingLeft="3dp"
        android:paddingRight="3dp"
        android:text="12"
        android:textSize="12sp" />

    <TextView
        android:id="@+id/tv_productAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/cart_biankuang"
        android:paddingLeft="5dp"
        android:paddingRight="5dp"
        android:text="+"
        android:textSize="12sp" />

</LinearLayout>

6.购物车expandablelistview的子布局页面

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="2dp">

    <CheckBox
        android:id="@+id/ck_product"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="12dp" />

    <TextView
        android:id="@+id/tv_del"
        android:layout_width="45dp"
        android:layout_height="30dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginRight="5dp"
        android:background="#ff0000"
        android:gravity="center"
        android:text="删除"
        android:textColor="#fff" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_toLeftOf="@id/tv_del"
        android:layout_toRightOf="@id/ck_product"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/img_product"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_gravity="center_vertical" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="2dp"
            android:layout_marginLeft="2dp"
            android:layout_marginTop="2dp"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv_producttitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="title"
                android:textSize="11sp" />

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <TextView
                    android:id="@+id/tv_productprice"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:text="12312"
                    android:textColor="#f00"
                    android:textSize="10sp" />

                <com.example.jingdong.ui.view.AddSubView
                    android:id="@+id/addsubcar"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentRight="true"
                    android:layout_marginRight="3dp"></com.example.jingdong.ui.view.AddSubView>

            </RelativeLayout>
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>



猜你喜欢

转载自blog.csdn.net/sui_yz/article/details/80155762