**
第三篇:进一步的完善购物车的功能,根据全选按钮的点击,改变所有商品的复选框状态,更新总的数量和价格,对适配器设置监听,监听加减按钮,商家的复选框,子条目的复选框的改变.
**
这篇文章搞定之后咱们整个购物车的功能就算实现了,在这里我做了以下操作
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
最后给大家看一下效果: