二级购物车代码


//////////////////////////////////父布局需要的属性
package com.example.gshopping.bean;

//一级的商家和选框
public class GroupBean {
    private String sellerName;///
    private boolean gropuCb;

    public GroupBean(String sellerName, boolean gropuCb) {
        this.sellerName = sellerName;
        this.gropuCb = gropuCb;
    }

    public String getSellerName() {
        return sellerName;
    }

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

    public boolean isGropuCb() {
        return gropuCb;
    }

    public void setGropuCb(boolean gropuCb) {
        this.gropuCb = gropuCb;
    }
}


////////////////////////////////////////子布局需要的属性
package com.example.gshopping.bean;
public class ChildBean {
    private String title;
    private String images;
    private double price;
    private int num;
    private boolean childCb;
    private boolean btn;

    public ChildBean(String title, String images, double price, int num, boolean childCb, boolean btn) {
        this.title = title;
        this.images = images;
        this.price = price;
        this.num = num;
        this.childCb = childCb;
        this.btn = btn;
    }

    public String getTitle() {
        return title;
    }

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

    public String getImages() {
        return images;
    }

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

    public double getPrice() {
        return price;
    }

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

    public int getNum() {
        return num;
    }

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

    public boolean isChildCb() {
        return childCb;
    }

    public void setChildCb(boolean childCb) {
        this.childCb = childCb;
    }

    public boolean isBtn() {
        return btn;
    }

    public void setBtn(boolean btn) {
        this.btn = btn;
    }
}


//////////////////////////////////////////工具类M层请求网络的代码
package com.example.gshopping.httputils;
import android.os.Handler;
import com.example.gshopping.interfaces.CallBack;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class HttpUtils {
     private static volatile HttpUtils instance;
         private static Handler handler = new Handler();

         private HttpUtils(){

         }
         public static HttpUtils getInstance() {
             if (instance == null) {
                 synchronized (HttpUtils.class) {
                     if (instance == null) {
                         instance = new HttpUtils();
                     }
                 }
             }
             return instance;
         }
         //get请求
         public void get(String url, Map<String,String> map, final CallBack callBack, final Class c,final String tag){
             //对url和参数做拼接处理
             StringBuffer stringBuffer = new StringBuffer();
             stringBuffer.append(url);
             //判断是否存在?   if中是存在
             if(stringBuffer.indexOf("?")!=-1 ){
                 //判断?是否在最后一位    if中是不在最后一位
                 if(stringBuffer.indexOf("?")!=stringBuffer.length()-1){
                     stringBuffer.append("&");
                 }
             }else{
                 stringBuffer.append("?");
             }
             for(Map.Entry<String,String> entry:map.entrySet()){
                 stringBuffer.append(entry.getKey())
                         .append("=")
                         .append(entry.getValue())
                         .append("&");
             }
             //判断是否存在&   if中是存在
             if(stringBuffer.indexOf("&")!=-1){
                 stringBuffer.deleteCharAt(stringBuffer.lastIndexOf("&"));
             }


             //1:创建OkHttpClient对象
             OkHttpClient okHttpClient = new OkHttpClient();
             //2:创建Request对象
             final Request request = new Request.Builder()
                     .get()
                     .url(stringBuffer.toString())
                     .build();
             //3:创建Call对象
             Call call = okHttpClient.newCall(request);
             //4:请求网络
             call.enqueue(new Callback() {
                 //请求失败
                 @Override
                 public void onFailure(Call call, final IOException e) {
                     handler.post(new Runnable() {
                         @Override
                         public void run() {
                             callBack.onFailed(e,tag);
                         }
                     });
                 }
                 //请求成功
                 @Override
                 public void onResponse(Call call, Response response) throws IOException {
                     String result = response.body().string();
                     //拿到数据解析
                     final Object o = new Gson().fromJson(result, c);
                     //当前是在子线程,回到主线程中
                     handler.post(new Runnable() {
                         @Override
                         public void run() {
                             //回调
                             callBack.onSuccess(o,tag);
                         }
                     });
                 }
             });

         }
         //post请求
         public void post(String url, Map<String,String> map, final CallBack callBack, final Class c,final String tag){
             //1:创建OkHttpClient对象
             OkHttpClient okHttpClient = new OkHttpClient();
             //2:提供post请求需要的body对象
             FormBody.Builder builder = new FormBody.Builder();
             for(Map.Entry<String,String> entry:map.entrySet()){
                 builder.add(entry.getKey(),entry.getValue());
             }
             FormBody body = builder.build();
             //3:创建Request对象
             final Request request = new Request.Builder()
                     .post(body)
                     .url(url)
                     .build();
             //4:创建Call对象
             Call call = okHttpClient.newCall(request);
             //5:请求网络
             call.enqueue(new Callback() {
                 //请求失败
                 @Override
                 public void onFailure(Call call, final IOException e) {
                     handler.post(new Runnable() {
                         @Override
                         public void run() {
                             callBack.onFailed(e,tag);
                         }
                     });
                 }
                 //请求成功
                 @Override
                 public void onResponse(Call call, Response response) throws IOException {
                     String result = response.body().string();
                     //拿到数据解析
                     final Object o = new Gson().fromJson(result, c);
                     //当前是在子线程,回到主线程中
                     handler.post(new Runnable() {
                         @Override
                         public void run() {
                             //回调
                             callBack.onSuccess(o,tag);
                         }
                     });
                 }
             });
         }
}




///////////////////////////////////persenres层的代码
package com.example.gshopping.persener;
import com.example.gshopping.httputils.HttpUtils;
import com.example.gshopping.interfaces.CallBack;
import com.example.gshopping.interfaces.Iview;
import java.util.Map;

public class Persener {
    private Iview inv;
    public void attach(Iview inv){
       this.inv=inv;
    }

    public void get(String url, Map<String,String>map,Class cls, String tag){
        HttpUtils.getInstance().get(url, map, new CallBack() {
            @Override
            public void onSuccess(Object o, String tag) {
                 if (o!=null){
                     inv.onSuccess(o,tag);
                 }
            }
            @Override
            public void onFailed(Exception e, String tag) {
                inv.onSuccess(e,tag);
            }
        },cls,tag);
    }

    //内存
    public void deleteView(){
        if(inv!=null){
            inv=null;
        }
    }
}


///////////////////////////////////CallBack接口的代码
public interface CallBack {
    void onSuccess(Object o,String tag);
    void onFailed(Exception e,String tag);
}

///////////////////////////////////View接口的代码
public interface Iview {
    void onSuccess(Object o,String tag);
    void onFailed(Exception e,String tag);
}

//////////////////////////////////算钱时的接口代码
public interface MoneyView {
    void isCheck(List<List<ChildBean>> list);
}

///////////////////////////////////MainActivity的代码
package com.example.gshopping;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;
import com.example.gshopping.adapter.ExpandableAdapter;
import com.example.gshopping.bean.ChildBean;
import com.example.gshopping.bean.GroupBean;
import com.example.gshopping.bean.Zbean;
import com.example.gshopping.interfaces.Iview;
import com.example.gshopping.persener.Persener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MainActivity extends AppCompatActivity implements Iview,MoneyView{
    private Persener persener;
    List<GroupBean> groupBeen=new ArrayList<>();
    List<List<ChildBean>> childBeen=new ArrayList<>();
    private ExpandableListView elv;
    private CheckBox all_chekbox;
    private TextView total_price;
    private TextView totalnumber;
    private ExpandableAdapter expandableAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取控件
        elv =(ExpandableListView)findViewById(R.id.elv);
        all_chekbox =(CheckBox)findViewById(R.id.all_chekbox);
        total_price =(TextView)findViewById(R.id.total_price);//价钱
        totalnumber = (TextView)findViewById(R.id.total_number);//底部数量

        //全选的点击事件
        all_chekbox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //初始值
                double money = 0;
                //判断全选的check是否为选择状态
                if(all_chekbox.isChecked()){
                    //更改父子check状态
                    for (int i=0;i<groupBeen.size();i++){
                        groupBeen.get(i).setGropuCb(true);
                        List<ChildBean> childBeen = MainActivity.this.childBeen.get(i);
                        for(int x=0;x<childBeen.size();x++){
                            childBeen.get(x).setChildCb(true);
                            //计算全选的价格
                            int num = childBeen.get(x).getNum();
                            double price = childBeen.get(x).getPrice();
                            money=money+num*price;
                        }
                    }
                    //设置底部的价格money的显示
                    total_price.setText(money+"");
                }else{
                    for (int i=0;i<groupBeen.size();i++){
                        groupBeen.get(i).setGropuCb(false);
                        List<ChildBean> childBeen = MainActivity.this.childBeen.get(i);
                        for(int x=0;x<childBeen.size();x++){
                            childBeen.get(x).setChildCb(false);
                        }
                    }
                    total_price.setText(0+"");
                }
                expandableAdapter.notifyDataSetChanged();
            }
        });


        //将P层对象创建出来
        persener = new Persener();
        persener.attach(this);
        HashMap<String, String> map = new HashMap<>();
        persener.get(" http://120.27.23.105/product/getCarts?uid=100",map,Zbean.class,"car");
    }

    //传过来数据之后进行获取并向集合添加
    @Override
    public void onSuccess(Object o, String tag) {
         if (o!=null&&tag.equals("car")){
             Zbean bean=(Zbean)o;
             List<Zbean.DataBean> data = bean.getData();
             for(Zbean.DataBean i:data){
                 GroupBean groupBean = new GroupBean(i.getSellerName(), false);
                 this.groupBeen.add(groupBean);
                 //二级
                 List<Zbean.DataBean.ListBean> list = i.getList();
                 List<ChildBean> ls=new ArrayList<>();
                 for(Zbean.DataBean.ListBean w:list){
                     String[] split = w.getImages().toString().split("\\|");
                     ChildBean childBean = new ChildBean(w.getTitle(), split[0], w.getPrice(), 1, false, false);
                     ls.add(childBean);
                 }
                  this.childBeen.add(ls);
             }
             expandableAdapter = new ExpandableAdapter(MainActivity.this, groupBeen, childBeen,this);
             elv.setAdapter(expandableAdapter);
         }

    }

    @Override
    public void onFailed(Exception e, String tag) {

    }

    //算钱的接口
    @Override
    public void isCheck(List<List<ChildBean>> list) {
        double money=0;
        for (int i=0;i<childBeen.size();i++){
            List<ChildBean> childBeen = MainActivity.this.childBeen.get(i);
            for(int x=0;x<childBeen.size();x++){
                //计算全选的价格
                if(childBeen.get(x).isChildCb()){
                    int num = childBeen.get(x).getNum();
                    double price = childBeen.get(x).getPrice();
                    money=money+num*price;
                }
            }
        }
        //设置底部的价格money的显示
        total_price.setText(money+"");
    }
}



///////////////////////////////////////二级适配器的代码
package com.example.gshopping.adapter;
import android.content.Context;
import android.util.Log;
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 com.bumptech.glide.Glide;
import com.example.gshopping.AddDeleteView;
import com.example.gshopping.MainActivity;
import com.example.gshopping.MoneyView;
import com.example.gshopping.R;
import com.example.gshopping.bean.ChildBean;
import com.example.gshopping.bean.GroupBean;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by on 2017/11/20.
 */

public class ExpandableAdapter extends BaseExpandableListAdapter {
    private Context context;
    private List<GroupBean> groupBeen;
    private  List<List<ChildBean>> childBeen;
    private TextView shop_title;
    private ImageView shop_img;
    private TextView shop_price;
    //实现该接口
    private MoneyView moneyview;

    public ExpandableAdapter(Context context, List<GroupBean> groupBeen, List<List<ChildBean>> childBeen,MoneyView moneyview) {
        this.context = context;
        this.groupBeen = groupBeen;
        this.childBeen = childBeen;
        this.moneyview = moneyview;
    }

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

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

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

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return childBeen.get(groupPosition).get(childPosition).getTitle();
    }

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

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

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

    @Override
    public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        View view = View.inflate(context, R.layout.grouplist, null);
        final CheckBox groupCb =(CheckBox)view.findViewById(R.id.group_checkbox);
        TextView shopName = (TextView) view.findViewById(R.id.shop_name);

        shopName.setText(groupBeen.get(groupPosition).getSellerName());
        groupCb.setChecked(groupBeen.get(groupPosition).isGropuCb());

        //一级的复选框
        groupCb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //checked 一级的check
                if(groupCb.isChecked()==true){
                    //遍历子集合 让子集合中的Boolean值改为true
                    List<ChildBean> childBeen1 = childBeen.get(groupPosition);
                    for(int x=0;x<childBeen1.size();x++){
                        childBeen1.get(x).setChildCb(true);
                    }
                    //改父级别的check的值
                    groupBeen.get(groupPosition).setGropuCb(true);
                    //刷新  重新加载
                    notifyDataSetChanged();

                    moneyview.isCheck(childBeen);
                }else{
                    List<ChildBean> childBeen1 = childBeen.get(groupPosition);
                    for(int x=0;x<childBeen1.size();x++){
                        childBeen1.get(x).setChildCb(false);
                    }
                    groupBeen.get(groupPosition).setGropuCb(false);
                    notifyDataSetChanged();
                }


                //3全选设置
                //得到Activity的全选按钮
                MainActivity tag= (MainActivity) context;
                CheckBox checkAll= (CheckBox) tag.findViewById(R.id.all_chekbox);
               //设置一个初始的boolean值 用来判断
                Boolean A=true;
                //遍历父集合
                for(int i=0;i<groupBeen.size();i++){
                    boolean gropuCb = groupBeen.get(i).isGropuCb();
                    if(gropuCb!=true){
                        A=false;
                        break;
                    }
                }
                //设置全选按钮
                checkAll.setChecked(A);

                moneyview.isCheck(childBeen);
            }
        });
        return view;
    }

    @Override
    public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        View view = View.inflate(context, R.layout.childlist, null);
        final CheckBox childCheck= (CheckBox) view.findViewById(R.id.child_checkbox);
        shop_title =(TextView)view.findViewById(R.id.shop_title);
        shop_img =(ImageView)view.findViewById(R.id.shop_img);
        shop_price =(TextView)view.findViewById(R.id.shop_price);

        //找到自定义的View主键
        final AddDeleteView adv= (AddDeleteView) view.findViewById(R.id.adddeleteview);
        adv.setNumber(childBeen.get(groupPosition).get(childPosition).getNum());

        adv.setOnAddDelClickListener(new AddDeleteView.OnAddDelClickListener() {
            @Override
            public void onAddClick(View v) {
                int origin=adv.getNumber();
                origin++;
                adv.setNumber(origin);

                //设置子check为true
                childBeen.get(groupPosition).get(childPosition).setChildCb(true);
                childBeen.get(groupPosition).get(childPosition).setNum(origin);

                Log.e("TAG",origin+"");

                notifyDataSetChanged();

                moneyview.isCheck(childBeen);

            }

            @Override
            public void onDelClick(View v) {
                int origin=adv.getNumber();
                origin--;
                adv.setNumber(origin);

                //设置子check为true
                childBeen.get(groupPosition).get(childPosition).setChildCb(true);
                childBeen.get(groupPosition).get(childPosition).setNum(origin);
                notifyDataSetChanged();

                moneyview.isCheck(childBeen);
            }
        });


        shop_title.setText(childBeen.get(groupPosition).get(childPosition).getTitle());
        String images = childBeen.get(groupPosition).get(childPosition).getImages();
        Glide.with(context).load(images).into(shop_img);
        shop_price.setText(childBeen.get(groupPosition).get(childPosition).getPrice()+"");
        childCheck.setChecked(childBeen.get(groupPosition).get(childPosition).isChildCb());

        //子级别的点击事件都点完之后  父级别根着动
        childCheck.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //得到子类里状态值
                boolean childCb = childBeen.get(groupPosition).get(childPosition).isChildCb();
                if(childCb){
                    childBeen.get(groupPosition).get(childPosition).setChildCb(false);
                }else{
                    childBeen.get(groupPosition).get(childPosition).setChildCb(true);
                }
                //写一个变量值用来判断
                Boolean A=true;
                //遍历子集合
                List<ChildBean> childBeen1 = childBeen.get(groupPosition);
                for (int i=0;i<childBeen1.size();i++){
                    //判断子级别中有没有false
                    if(childBeen1.get(i).isChildCb()==false){
                        A=false;
                    }
                }
                //如果为true 子级别全选
                if(A){
                    //设置父级别的选择框
                    groupBeen.get(groupPosition).setGropuCb(true);
                }else{
                    groupBeen.get(groupPosition).setGropuCb(false);
                }
                notifyDataSetChanged();



                //子级别的全选按钮的判断设置
                MainActivity tag= (MainActivity) context;
                CheckBox checkAll= (CheckBox) tag.findViewById(R.id.all_chekbox);
                //设置一个初始的boolean值 用来判断
                Boolean B=true;
                //遍历父集合
                for(int x=0;x<childBeen.size();x++){
                    List<ChildBean> childBeen = ExpandableAdapter.this.childBeen.get(x);
                    for(int j=0;j<childBeen.size();j++){
                        boolean childCb1 = childBeen.get(j).isChildCb();
                        if(childCb1!=true){
                            B=false;
                            break;
                        }
                    }
                }
                //设置全选按钮
                checkAll.setChecked(B);

                moneyview.isCheck(childBeen);
            }
        });
        return view;
    }

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






////////////////////////////////////////自定义View的代码
package com.example.gshopping;
import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

/**
 * Created by on 2017/11/21.
 * 自定义View的加减号
 */

public class AddDeleteView extends LinearLayout {

    //设置接口回调
    private OnAddDelClickListener Listener;
    private TextView etNumber;

    public interface OnAddDelClickListener{
        void onAddClick(View v);
        void onDelClick(View v);
    }
    //接口对象
    public void setOnAddDelClickListener(OnAddDelClickListener Listener){
        if (Listener!=null){
            this.Listener=Listener;
        }
    }


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

    public AddDeleteView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }

    public AddDeleteView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        //加载布局
        View view = View.inflate(context, R.layout.zidingyiview, this);

        //获得主键
        TextView txtDelete = (TextView) findViewById(R.id.txt_delete);
        TextView txtAdd = (TextView) findViewById(R.id.txt_add);
        etNumber = (TextView) findViewById(R.id.et_number);

        //点击事件
        txtAdd.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Listener.onAddClick(AddDeleteView.this);
            }
        });

        txtDelete.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Listener.onDelClick(AddDeleteView.this);
            }
        });
    }

    //对外提供设置EditText值得方法
    public void setNumber(int number){
        if (number>0){
            etNumber.setText(number+"");
        }
    }

    public int getNumber(){
        int number=0;
        try {
            String trim = etNumber.getText().toString().trim();
            number = Integer.valueOf(trim);
        }catch (Exception e){
            number=0;
        }
        return number;
    }

}


//默认展开
for (int i = 0; i< expandableAdapter.getGroupCount(); i++){
    exlv.expandGroup(i);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值