MVP实现购物车

需要的依赖

implementation 'com.squareup.okhttp3:okhttp:3.4.2'
implementation 'com.google.code.gson:gson:2.2.4'
implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

.activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".MainActivity"
    android:orientation="vertical">

    <ExpandableListView
        android:id="@+id/ex_listview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="9">
    </ExpandableListView>

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

        <CheckBox
            android:id="@+id/ck_all"
            android:text="全选"
            android:textSize="18sp"
            android:layout_gravity="center_vertical"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/tv_zong"
            android:text="合计:¥0.00"
            android:textSize="20sp"
            android:layout_gravity="center_vertical"
            android:layout_weight="2"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/btn_jiesuan"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="结算(0)"
            android:textSize="20sp"
            android:background="#7ec4c9"/>

    </LinearLayout>

</LinearLayout>

.MainActivity

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    String url = "http://www.zhaoapi.cn/product/getCarts";
    private ExpandableListView ex_listview;
    private CheckBox ck_all;
    private TextView tv_zong;
    private Button btn_jiesuan;
    private MyAdapter ma;
    private Presenter mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
    }

    private void initView() {
        ex_listview = findViewById(R.id.ex_listview);
        ck_all = findViewById(R.id.ck_all);
        tv_zong = findViewById(R.id.tv_zong);
        btn_jiesuan = findViewById(R.id.btn_jiesuan);

        btn_jiesuan.setOnClickListener(this);
        ck_all.setOnClickListener(this);
    }

    private void initData() {
        HashMap<String, String> map = new HashMap<>();
        map.put("uid", "71");

        Presenter presenter = new Presenter();
        presenter.LhxPresenter(url, map, new Presenter.LhxInterface() {
            @Override
            public void success(List<Shop.DataBean> dataBeans) {
                //得到含有具体数据的集合
                ma = new MyAdapter(dataBeans);
                ex_listview.setAdapter(ma);
                //设置去掉默认向下的箭头
                ex_listview.setGroupIndicator(null);
                //直接展开二级列表
                for (int i = 0; i < dataBeans.size(); i++) {
                    ex_listview.expandGroup(i);
                }
                ma.setOnShopChangeListener(new MyAdapter.onShopChangeListener() {
                    @Override
                    public void onCheckGroup(int groupPosition) {
                        //商家的点击
                        boolean allSelected = ma.isAllSelected(groupPosition);
                        ma.groupCheck(groupPosition, !allSelected);
                        ma.notifyDataSetChanged();
                        //刷新底部数据
                        refreshData();
                    }

                    @Override
                    public void onCheckChild(int groupPosition, int childPosition) {
                        //商品的点击
                        ma.childCheck(groupPosition, childPosition);
                        ma.notifyDataSetChanged();
                        //刷新底部数据
                        refreshData();
                    }

                    @Override
                    public void onAddSub(int groupPosition, int childPosition, int num) {
                        //加减的点击
                        ma.addsub(groupPosition, childPosition, num);
                        ma.notifyDataSetChanged();
                        //刷新底部数据
                        refreshData();
                    }
                });
                //刷新底部数据
                refreshData();
            }

            @Override
            public void failed() {

            }
        });
    }

    private void refreshData() {
        //判断是否所有商品都被选中
        boolean allAllSelected = ma.isAllAllSelected();
        //设置给全选CheckBox
        ck_all.setChecked(allAllSelected);
        //计算总价
        float shopPrice = ma.shopPrice();
        tv_zong.setText("总价"+shopPrice);
        //计算总数量
        int shopNumber = ma.shopNumber();
        btn_jiesuan.setText("结算("+shopNumber+")");
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_jiesuan:
                Toast.makeText(this, "没有钱!", Toast.LENGTH_SHORT).show();
                break;
            case R.id.ck_all://底部全选按钮
                //判断是否所有商品都被选中
                boolean allAllSelected = ma.isAllAllSelected();
                ma.shopCheck(!allAllSelected);
                ma.notifyDataSetChanged();
                refreshData();
                break;
        }
    }
}

.MyAdapter

public class MyAdapter extends BaseExpandableListAdapter {

    private List<Shop.DataBean> mDataBeans;

    public MyAdapter(List<Shop.DataBean> dataBeans) {
        mDataBeans = dataBeans;
    }

    //组的个数
    @Override
    public int getGroupCount() {
        return mDataBeans == null ? 0 : mDataBeans.size();
    }

    //组里面的条目数
    @Override
    public int getChildrenCount(int groupPosition) {
        return mDataBeans.get(groupPosition).getList() == null ? 0 : mDataBeans.get(groupPosition).getList().size();
    }


    //组的布局,相似于listview
    @Override
    public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        Shop.DataBean dataBean = mDataBeans.get(groupPosition);
        ViewHolder vh;
        if (convertView == null) {
            convertView = View.inflate(parent.getContext(), R.layout.groupitems, null);
            vh = new ViewHolder(convertView);
            convertView.setTag(vh);
        } else {
            vh = (ViewHolder) convertView.getTag();
        }
        vh.tv_name.setText(dataBean.getSellerName());

        //根据当前商家的所有商品,确定商家的CheckBox是否选中
        boolean allSelected = isAllSelected(groupPosition);
        //根据这个Boolean判断是否选中
        vh.ck_ck.setChecked(allSelected);
        //设置点击CheckBox
        vh.ck_ck.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnShopChangeListener != null){
                    mOnShopChangeListener.onCheckGroup(groupPosition);
                }
            }
        });

        return convertView;
    }

    public static class ViewHolder {
        public View rootView;
        public CheckBox ck_ck;
        public TextView tv_name;

        public ViewHolder(View rootView) {
            this.rootView = rootView;
            this.ck_ck = (CheckBox) rootView.findViewById(R.id.ck_ck);
            this.tv_name = (TextView) rootView.findViewById(R.id.tv_name);
        }
    }

    //子条目的布局
    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        Shop.DataBean dataBean = mDataBeans.get(groupPosition);

        List<Shop.DataBean.ListBean> list = dataBean.getList();

        Shop.DataBean.ListBean listBean = list.get(childPosition);

        ChildViewHolder childViewHolder;
        if (convertView == null) {
            convertView = View.inflate(parent.getContext(), R.layout.childitems, null);
            childViewHolder = new ChildViewHolder(convertView);
            convertView.setTag(childViewHolder);
        } else {
            childViewHolder = (ChildViewHolder) convertView.getTag();
        }

        //设置商品名字
        childViewHolder.tv_childname.setText(listBean.getTitle());
        //设置商品单价
        childViewHolder.tv_childprice.setText(listBean.getPrice()+"");
        //获取图片
        String images = listBean.getImages();
        String[] split = images.split("!");
        //设置商品图片
        ImageLoader.getInstance().displayImage(split[0],childViewHolder.iv1,ImageLoadfigs.getops(parent.getContext()));
        //设置复选框是否选中
        childViewHolder.ck_child.setChecked(listBean.getSelected() == 1);
        //设置组合式自定义控件内部的数量
        childViewHolder.add_remove_view.setNumber(listBean.getNum());

        //checkbox的点击事件
        childViewHolder.ck_child.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnShopChangeListener != null){
                    mOnShopChangeListener.onCheckChild(groupPosition, childPosition);
                }
            }
        });

        //加减的点击事件
        childViewHolder.add_remove_view.setOnNumberChangeListener(new MyAddSubView.OnNumberChangeListener() {
            @Override
            public void onNumberChange(int num) {
                if (mOnShopChangeListener != null){
                    mOnShopChangeListener.onAddSub(groupPosition, childPosition, num);
                }
            }
        });

        return convertView;
    }

    class ChildViewHolder {
        public View rootView;
        public CheckBox ck_child;
        public ImageView iv1;
        public TextView tv_childname;
        public TextView tv_childprice;
        public MyAddSubView add_remove_view;

        public ChildViewHolder(View rootView) {
            this.rootView = rootView;
            this.ck_child = (CheckBox) rootView.findViewById(R.id.ck_child);
            this.iv1 = (ImageView) rootView.findViewById(R.id.iv1);
            this.tv_childname = (TextView) rootView.findViewById(R.id.tv_childname);
            this.tv_childprice = (TextView) rootView.findViewById(R.id.tv_childprice);
            this.add_remove_view = (MyAddSubView) rootView.findViewById(R.id.add_remove_view);
        }

    }


    //判断当前商家所有商品是否被选中了(一种全都被选中,一种是没有全都选中)
    public boolean isAllSelected(int groupPosition){
        //拿到对应组的数据
        Shop.DataBean dataBean = mDataBeans.get(groupPosition);
        //拿到商家的所有数据,是一个集合
        List<Shop.DataBean.ListBean> list = dataBean.getList();

        for (Shop.DataBean.ListBean listBean :list){
            //判断这个组的所有商品是否被全选中,如果有一个没有被选中,那么商家就是未选中状态
            if (listBean.getSelected() == 0){
                return false;
            }
        }
        return true;
    }

    //底部的全选按钮,类似上边的
    public boolean isAllAllSelected(){
        for (int i = 0; i < mDataBeans.size(); i++) {
            //拿到对应组的数据
            Shop.DataBean dataBean = mDataBeans.get(i);
            //拿到商家的所有数据,是一个集合
            List<Shop.DataBean.ListBean> list = dataBean.getList();
            for (int j = 0; j < list.size(); j++) {
                //判断这个组的所有商品是否被全选中,如果有一个没有被选中,那么商家就是未选中状态
                if (list.get(j).getSelected() == 0){
                    return false;
                }
            }
        }
        return true;
    }

    //计算商品总数量
    public int shopNumber(){
        int totalNumber = 0;
        for (int i = 0; i < mDataBeans.size(); i++) {
            //拿到对应组的数据
            Shop.DataBean dataBean = mDataBeans.get(i);
            //拿到商家的所有数据,是一个集合
            List<Shop.DataBean.ListBean> list = dataBean.getList();
            for (int j = 0; j < list.size(); j++) {
                //只计算选中的
                if (list.get(j).getSelected()==1){
                    //拿到商品数量
                    int num = list.get(j).getNum();
                    totalNumber += num;
                }
            }
        }
        return totalNumber;
    }

    //计算总价
    public float shopPrice(){
        float totalPrice = 0;
        for (int i = 0; i < mDataBeans.size(); i++) {
            //拿到对应组的数据
            Shop.DataBean dataBean = mDataBeans.get(i);
            //拿到商家的所有数据,是一个集合
            List<Shop.DataBean.ListBean> list = dataBean.getList();
            for (int j = 0; j < list.size(); j++) {
                //只计算选中的
                if (list.get(j).getSelected()==1){
                    //拿到商品数量 价钱
                    int num = list.get(j).getNum();
                    float price = (float) list.get(j).getPrice();
                    totalPrice += num*price;
                }
            }
        }
        return totalPrice;
    }

    //当商品组的全选框点击时,更新所有商品的状态
    public void groupCheck(int groupPosition,boolean isSelected){
        //拿到对应组的数据
        Shop.DataBean dataBean = mDataBeans.get(groupPosition);
        //拿到商家的所有数据,是一个集合
        List<Shop.DataBean.ListBean> list = dataBean.getList();

        for (int i = 0; i < list.size(); i++) {
            Shop.DataBean.ListBean listBean = list.get(i);
            listBean.setSelected(isSelected ? 1 : 0);
        }
    }

    //当商家子条目的全选框选中时,更新其状态
    public void childCheck(int groupPosition,int childPosition){
        //拿到对应组的数据
        Shop.DataBean dataBean = mDataBeans.get(groupPosition);
        //拿到商家的所有数据,是一个集合
        List<Shop.DataBean.ListBean> list = dataBean.getList();

        Shop.DataBean.ListBean listBean = list.get(childPosition);
        listBean.setSelected(listBean.getSelected() == 0 ? 1 : 0);
    }

    //设置所有商品的状态
    public void shopCheck(boolean selected){
        for (int i = 0; i < mDataBeans.size(); i++) {
            //拿到对应组的数据
            Shop.DataBean dataBean = mDataBeans.get(i);
            //拿到商家的所有数据,是一个集合
            List<Shop.DataBean.ListBean> list = dataBean.getList();
            for (int j = 0; j < list.size(); j++) {
                list.get(j).setSelected(selected ? 1 : 0);
            }
        }
    }

    //商品数量的加减
    public void addsub(int groupPosition,int childPosition,int num){
        //拿到对应组的数据
        Shop.DataBean dataBean = mDataBeans.get(groupPosition);
        //拿到商家的所有数据,是一个集合
        List<Shop.DataBean.ListBean> list = dataBean.getList();

        Shop.DataBean.ListBean listBean = list.get(childPosition);
        listBean.setNum(num);
    }

    //接口回调
    public interface onShopChangeListener{
        //点击商家的check按钮
        void onCheckGroup(int groupPosition);
        //点击条目的check按钮
        void onCheckChild(int groupPosition,int childPosition);
        //点击加减
        void onAddSub(int groupPosition,int childPosition,int num);
    }

    onShopChangeListener mOnShopChangeListener;

    public void setOnShopChangeListener(onShopChangeListener onShopChangeListener) {
        mOnShopChangeListener = onShopChangeListener;
    }

    //
    @Override
    public Object getGroup(int groupPosition) {
        return null;
    }

    //
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return null;
    }

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

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

    //
    @Override
    public boolean hasStableIds() {
        return false;
    }

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

.presenter

public class Presenter {

    public void LhxPresenter(String url, Map<String,String> map,final LhxInterface lhxInterface){
        OkHttpUtil instance = OkHttpUtil.getInstance();
        instance.doPost(url, map, new OkHttpUtil.OkCallback() {
            @Override
            public void onFailure(Exception e) {

            }

            @Override
            public void onResponse(String json) {
                Shop shop = new Gson().fromJson(json, Shop.class);
                List<Shop.DataBean> dataBeans = shop.getData();
                lhxInterface.success(dataBeans);
            }
        });
    }

    public interface LhxInterface{
        void success(List<Shop.DataBean> dataBeans);
        void failed();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值