购物车(下)

**

第三篇:进一步的完善购物车的功能,根据全选按钮的点击,改变所有商品的复选框状态,更新总的数量和价格,对适配器设置监听,监听加减按钮,商家的复选框,子条目的复选框的改变.

**
这篇文章搞定之后咱们整个购物车的功能就算实现了,在这里我做了以下操作
1.首先就是我给商品展示将图片展示出来,自定义一个类,这个类继承Applaction.在这里我们一定要记得在(AndroidManifest)清单文件中注册,在这使用的是iamgeloader,我们要记得添加imageloader的依赖,我给图片设置了两种样式,一种默认的,一种圆形的,大家根据所需选则其一即可.
2.在MainActivity中对接口进行调用,完成最终的业务操作
在AndroidManifest注册imageloader

android:name=".MyApp"

imageloader依赖

implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

MainActivity:

package com.cart.cartdemo;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private ExpandableListView el_cart;
    private CheckBox cb_cart_all_select;
    private TextView tv_cart_total_price;
    private Button btn_cart_pay;
    String url = "http://www.zhaoapi.cn/product/getCarts";
    private MyAdapter mMyAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        initView();
        //初始化数据
       initData();
    }

    private void initData() {
        HashMap<String,String > map = new HashMap<>();
        map.put("uid","71");
        OkHttpUtil.getInstance().doPost(url, map, new OkHttpUtil.OkCallback() {
            @Override//请求失败时执行该方法
            public void onFailure(Exception e) {
            }
            @Override//请求成功时执行该方法
            public void onResponse(String json) {
                Log.e("lz",json+"");
                CartInfo cartInfo = new Gson().fromJson(json, CartInfo.class);
                //如果字段是0的话,代表网络请求成功
                if ("0".equals(cartInfo.getCode())){
                    //得到含有具体数据的集合
                    List<CartInfo.DataBean> data = cartInfo.getData();

                    //把数据给Adapter,创建Adadpter
                    mMyAdapter = new MyAdapter(data,MainActivity.this);

                    //D.对适配器设置监听,监听加减按钮,商家的复选框,子条目的复选框状态的改变
                    mMyAdapter.setOnCartListener(new MyAdapter.onCartListener() {
                        //当商家被点击的时候回调
                        @Override
                        public void onParentCheckboxChange(int groupPosition) {
                           boolean goodsSelected =  mMyAdapter.isGoodsSelected(groupPosition);
                            //提示为什么!isGoodsSelected取反,因为像灯一样,亮为true,暗为false,我先看灯是亮的,true,那么
                            //我要把他关了,取反把true改为false,然后设置进去,那么每一次我按钮的时候,都是拿到当前的状态,取反,再设置进去
                            mMyAdapter.changeParentGoods(groupPosition , !goodsSelected);
                            mMyAdapter.notifyDataSetChanged();
                            //刷新底部
                            refreshSelected();
                        }
                        //当点击子条目商品的Checkbook回调
                        @Override
                        public void onChildCheckboxChange(int groupPosition, int childPosition) {
                               mMyAdapter.changeChildGoods(groupPosition,childPosition);
                               mMyAdapter.notifyDataSetChanged();
                               //刷新底部
                            refreshSelected();
                        }
                        //当点击加减按钮的时候回调
                        @Override
                        public void onAddSubNumberChange(int groupPosition, int childPosition, int number) {
                           mMyAdapter.changeAddSubNumber(groupPosition,childPosition,number);
                           mMyAdapter.notifyDataSetChanged();
                           //刷新底部
                            refreshSelected();
                        }
                    });
                    //设置Adapter 对象
                    el_cart.setAdapter(mMyAdapter);

                    //设置展开二级列表
                    for (int x = 0; x < data.size(); x++){
                       el_cart.expandGroup(x);
                    }
                }
            }
        });
    }

    private void initView() {
        el_cart = (ExpandableListView) findViewById(R.id.el_cart);
        cb_cart_all_select = (CheckBox) findViewById(R.id.cb_cart_all_select);
        tv_cart_total_price = (TextView) findViewById(R.id.tv_cart_total_price);
        btn_cart_pay = (Button) findViewById(R.id.btn_cart_pay);

        cb_cart_all_select.setOnClickListener(this);
        btn_cart_pay.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {//设置底部复选框的点击事件
            case R.id.cb_cart_all_select :
                Log.e("lz","skfh");
                boolean allGoodsSelected = mMyAdapter.isAllGoodsSelected();
                mMyAdapter.changeAllGoods(!allGoodsSelected);
                mMyAdapter.notifyDataSetChanged();
                //刷新底部
                refreshSelected();
                break;
        }
    }

    //B.刷新底部的全选框,textView和Button的UI,改变了CheckBox状态,总价,总数量
    public void refreshSelected(){
        //去判断是否所有的商品都被选中
        boolean allGoodsSelected = mMyAdapter.isAllGoodsSelected();
        //把这个值设置给CheckBox
        cb_cart_all_select.setChecked(allGoodsSelected);

        //计算总价
        float totalPrice = mMyAdapter.goodsTotalPrice();
        tv_cart_total_price.setText("合计:" + totalPrice);

        //计算总数量
        int totalNumber = mMyAdapter.goodsTotalNumber();
        btn_cart_pay.setText("去结算("+totalNumber+")");
    }
}

自定义图片类MyApp

package com.cart.cartdemo;

import android.app.Application;

import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;

/**
 * date:2018/11/21
 * author:李壮(HUAWEI)
 * function:
 */
public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        ImageLoaderConfiguration imageLoaderConfiguration = new ImageLoaderConfiguration.Builder(this)
                //设置磁盘大小
                .diskCacheSize(50*1024*1024)
                //设置内存大小
                .memoryCacheSize(10)
                //设置图片展示样式
                .defaultDisplayImageOptions(Config.disPlay())
                .build();
        ImageLoader.getInstance().init(imageLoaderConfiguration);
    }
}

设置图片样式

package com.cart.cartdemo;

import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.display.CircleBitmapDisplayer;

/**
 * date:2018/11/21
 * author:李壮(HUAWEI)
 * function:
 */
public class Config {

    //默认样式
    public static DisplayImageOptions disPlay(){
        DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
                //是否缓存到磁盘
                .cacheOnDisk(true)
                //是否缓存到内存
                .cacheInMemory(true)
                .build();
        return displayImageOptions;
    }
    //将图片样式设置成圆形
    public static DisplayImageOptions disPlayCBD(){
        DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
                //是否缓存到磁盘
                .cacheOnDisk(true)
                //是否缓存到内存
                .cacheInMemory(true)
                //将图片样式设置成圆形
                .displayer(new CircleBitmapDisplayer())
                .build();
        return displayImageOptions;
    }
}

最后也就只剩下Adapter,这里改变不大 只是设置了以下图片,所以在这只给大家展示以下设置图片的代码,节省大家的阅读时间

  ///////////////////子条目的布局及其相关操作///////////////
    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        //先拿到子条目的所有数据
        CartInfo.DataBean dataBean = mDataBeans.get(groupPosition);
        List<CartInfo.DataBean.ListBean> list = dataBean.getList();

        //拿到List集合里具体的商品信息
        CartInfo.DataBean.ListBean listBean = list.get(childPosition);

        ChildViewHolder childViewHolder;
        if (convertView == null) {
            convertView = View.inflate(mContext,R.layout.item_cart_child,null);
            childViewHolder = new ChildViewHolder(convertView);
            convertView.setTag(childViewHolder);
        } else {
            childViewHolder = (ChildViewHolder) convertView.getTag();
        }
        //设置商品名字
        childViewHolder.product_title_name_tv.setText(listBean.getTitle());
        //设置商品价格
        childViewHolder.product_price_tv.setText(listBean.getPrice()+"");
        //设置复选框是否选中
        childViewHolder.child_cb.setChecked(listBean.getSelected() == 1);
        //设置组合式自定义控件内部的数量
        childViewHolder.add_remove_view.setNumber(listBean.getNum());

        //设置商品图片
        String[] split = listBean.getImages().split("!");
        ImageLoader.getInstance().displayImage(split[0],childViewHolder.product_icon_iv,Config.disPlay());

        //D.设置商品Checkbook的点击事件,通过接口回调,暴露给外面
        childViewHolder.child_cb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mOnCartListener != null){
                    mOnCartListener.onChildCheckboxChange(groupPosition,childPosition);
                }
            }
        });

        //D.设置商品数量的点击事件,通过接口回调,暴露给外面
        childViewHolder.add_remove_view.setOnNumberChangeListener(new MyAddSubView.OnNumberChangeListener() {
            @Override
            public void onNumberChange(int num) {
                if (mOnCartListener != null){
                    mOnCartListener.onAddSubNumberChange(groupPosition,childPosition,num);
                }
            }
        });
        return convertView;
    }

    public static class ChildViewHolder {
        public CheckBox child_cb;
        public ImageView product_icon_iv;
        public TextView product_title_name_tv;
        public TextView product_price_tv;
        public MyAddSubView add_remove_view;

        public ChildViewHolder(View rootView) {
            this.child_cb = (CheckBox) rootView.findViewById(R.id.child_cb);
            this.product_icon_iv = (ImageView) rootView.findViewById(R.id.product_icon_iv);
            this.product_title_name_tv = (TextView) rootView.findViewById(R.id.product_title_name_tv);
            this.product_price_tv = (TextView) rootView.findViewById(R.id.product_price_tv);
            this.add_remove_view = (MyAddSubView) rootView.findViewById(R.id.add_remove_view);
        }

    }

好了到这里我们就结束了购物车的探讨,希望能够给大家带来帮助,
之前的两篇文章链接也分享给大家
第一篇:实现购物车的UI效果:
https://blog.csdn.net/LZ0419/article/details/84317572
第二篇:实现一些购物车特有的方法,例如:判断这个商家与商品是否选中,计算商品的总数量,计算商品的总价,还有这个根据用户的选择,改变商家或商品的状态.:
https://blog.csdn.net/LZ0419/article/details/84323506
最后给大家看一下效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LZ0419/article/details/84328334