android 二级列表实现购物车

我把购物车写在了fragment里面  INewView是一个接口,懂MVP的应该都知道
public class CarFragment extends Fragment implements INewView{

	
    private View view;
    private ExpandableListView exListView;
    public CheckBox allCheckbox;
    private TextView totalPrice;
    private TextView totalnumber;
    private FZP presenter;
    private ExpandableAdapter expandableAdapter;
//一级列表的List集合
    List<GroupBean> groupBeen=new ArrayList<>();
//二级列表的List集合
    List<List<ChildBean>> childBeen=new ArrayList<>();
    private TextView tvEdit;
    private boolean flagedit =true;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        view = inflater.inflate(R.layout.car_fragment,container, false);

        initView();
	//这里是封装的一个P层,图省事 P层不建议封装使用,毕竟我们用MVP是为了解耦
        presenter = new FZP();
        presenter.attachView(this);
        return view;
    }
		
	
        private void initView(){
            exListView = (ExpandableListView) view.findViewById(R.id.exListView);
            allCheckbox = (CheckBox)view.findViewById(R.id.all_chekbox);
            totalPrice = (TextView)view.findViewById(R.id.total_price);
            totalnumber = (TextView)view.findViewById(R.id.total_number);
            tvEdit = view.findViewById(R.id.edit);
        }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Map<String,String> map = new HashMap<>();
        presenter.get("http://120.27.23.105/product/getCarts?uid=100",map,"car",ShopCarBean.class);

        //获取二级列表适配器
        expandableAdapter = new ExpandableAdapter();
        exListView.setAdapter(expandableAdapter);

        for(int i = 0; i < expandableAdapter.getGroupCount(); i++){

            exListView.expandGroup(i);

        }

        exListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView expandableListView, View view, int i, long l) {
                return true;
            }
        });

        //全选监听
        allCheckbox.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                boolean checked = allCheckbox.isChecked();
                //改变一级item复选框
                for (GroupBean i:groupBeen){
                    i.setGropuCb(checked);
                }
                //改变二级item复选框
                for (List<ChildBean> i1:childBeen){
                    for(int r=0;r<i1.size();r++) {
                        i1.get(r).setChildCb(checked);
                    }
                }
                expandableAdapter.notifyDataSetChanged();
                changesum(childBeen);
                //Toast.makeText(Main2Activity.this,"全选按钮"+checked,Toast.LENGTH_SHORT).show();
            }
        });

        tvEdit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String trim = tvEdit.getText().toString().trim();
                if(trim.equals("编辑")){
                    tvEdit.setText("完成");


                }else{
                    tvEdit.setText("编辑");
                }

                for (List<ChildBean> i1:childBeen){
                    for(int r=0;r<i1.size();r++) {
                        //
                        i1.get(r).setBtn(flagedit);
                    }
                }
                flagedit=!flagedit;
                expandableAdapter.notifyDataSetChanged();

            }

        });

    }

    @Override
    public void success(String tag, Object o) {
        if(o!=null&&tag.equals("car")){
            //请求回的数据进行强转
            ShopCarBean shopCarBean= (ShopCarBean) o;
            //得到我么所需要的数据
            List<ShopCarBean.DataBean> data = shopCarBean.getData();
            //遍历
            for (ShopCarBean.DataBean i:data){
                //给一级列表Bean添加数据
                GroupBean groupBean = new GroupBean(i.getSellerName(), false);
                //一级列表List集合添加数据
                this.groupBeen.add(groupBean);

                //获得我们二级列表需要的数据
                List<ShopCarBean.DataBean.ListBean> list = i.getList();
                //创建一个二级列表List集合
                List<ChildBean> ls=new ArrayList<>();
                //遍历
                for (ShopCarBean.DataBean.ListBean w:list){
                    //图片地址需要拆分
                    String[] split = w.getImages().split("\\|");
                    //给二级列表Bean类赋值
                    ChildBean childBean = new ChildBean(w.getTitle(), split[0], w.getPrice(), 1, false,false);

                    //放入我们创建的二级列表List集合
                    ls.add(childBean);
                }
                //把整个二级列表List集合添加给我们的二级List
                this.childBeen.add(ls);

            }
            //展开
            for(int i = 0; i < expandableAdapter.getGroupCount(); i++){
                exListView.expandGroup(i);
            }
            //刷新适配器
            expandableAdapter.notifyDataSetChanged();

        }
    }

    @Override
    public void failed(String tag, String e) {
        Toast.makeText(getActivity(),e+"",Toast.LENGTH_SHORT).show();
    }
    DecimalFormat df  = new DecimalFormat("######0.00");

    //计算和数量总价
    public void changesum(List<List<ChildBean>> childBeen){
        int count=0;
        double sum=0;
        for (List<ChildBean> i1:childBeen){
            for(int r=0;r<i1.size();r++) {
                boolean childCb1 = i1.get(r).isChildCb();
                if(childCb1){
                    double price = i1.get(r).getPrice();
                    int num = i1.get(r).getNum();
                    sum+=price*num;
                    count++;
                }
            }
        }

        totalPrice.setText("¥"+df.format(sum));
        totalnumber.setText("共有商品:"+count+"件");
    }


这里是适配器 我们需要传过来三个参数 一个是上下文 还有两个List集合,如果二级列表是在fragment里面需要多传一个Fragment
这里我没有传参是因为我把适配器写成内部类了
public class ExpandableAdapter extends BaseExpandableListAdapter {



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

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

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

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

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

    @Override
    public long getChildId(int i, int i1) {
        return i1;
    }

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

    //一级组
    @Override
    public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) {
        //加载视图
        view=View.inflate(getActivity(), R.layout.ex_group_item ,null);
        //获得一级列表复选框
        final CheckBox groupCb= view.findViewById(R.id.group_checkbox);
        TextView shopName= view.findViewById(R.id.shop_name);


        shopName.setText(groupBeen.get(i).getSellerName());
        //给一级列表复选框设置选中状态
        groupCb.setChecked(groupBeen.get(i).isGropuCb());

        //组复选按钮
        groupCb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //获得一级列表复选框当前状态
                boolean gchecked = groupCb.isChecked();
                //把一级列表当前的选中状态存到一级列表List集合里面
                groupBeen.get(i).setGropuCb(gchecked);
                //循环遍历一级列表的Bean类
                for(GroupBean i: groupBeen){
                    //获得Bean类中的状态
                    boolean gropuCb = i.isGropuCb();
                    //取反   如果取出的状态是true改为false 如果是false改为true
                    if(!gropuCb){
                        allCheckbox.setChecked(false);
                        //状态设为false跳出循环
                        break;
                    }else{
                        allCheckbox.setChecked(true);
                    }
                }
                //二级列表当前Bean类的长度
                int size = childBeen.get(i).size();
                //一级列表复选框当前状态如果为true,就把当前所有的二级列表里面全设置为true
                if(gchecked){
                    //用当前二级列表的Bean类长度循环设置状态
                    for(int r=0;r<size;r++){

                        childBeen.get(i).get(r).setChildCb(true);
                    }
                }else{ //一级列表复选框当前状态如果为false,就把当前所有的二级列表里面全设置为false

                    //用当前二级列表的Bean类长度循环设置状态
                    for(int r=0;r<size;r++){

                        childBeen.get(i).get(r).setChildCb(false);
                    }
                }
                //刷新适配器
                notifyDataSetChanged();
                //计算价格的方法,把二级列表的List集合传过去
                changesum(childBeen);
            }
        });
        return view;
    }

    //二级组
    @Override
    public View getChildView(final int i, final int i1, boolean b, View v, ViewGroup viewGroup) {
        //加载视图
        v=View.inflate(getActivity(), R.layout.ex_child_item ,null);
        //获得二级列表的复选框
        final CheckBox childCb = v.findViewById(R.id.child_checkbox);
        TextView shopTitle= v.findViewById(R.id.shop_title);
        TextView shopPrice= v.findViewById(R.id.shop_price);
        ImageView shopImg=v.findViewById(R.id.shop_img);

        //获取自定义加减器
        final AddDeleteView adv = v.findViewById(R.id.adv);
        Button shop_delete=v.findViewById(R.id.shop_delete);
        //控制删除按钮的显隐
        if(childBeen.get(i).get(i1).isBtn()){
            shop_delete.setVisibility(View.VISIBLE);
        }else{
            shop_delete.setVisibility(View.INVISIBLE);
        }
        //删除按钮监听
        shop_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int size = childBeen.get(i).size();
                if (size == 1) {
                    childBeen.remove(i);
                    groupBeen.remove(i);
                } else {
                    childBeen.get(i).remove(i1);
                }
                notifyDataSetChanged();
                changesum(childBeen);
            }
        });



                //通过二级列表的List集合取出状态,给二级列表的复选框设置状态
        childCb.setChecked(childBeen.get(i).get(i1).isChildCb());

        Glide.with(getActivity()).load(childBeen.get(i).get(i1).getImages()).into(shopImg);
        shopTitle.setText(childBeen.get(i).get(i1).getTitle());
        shopPrice.setText(childBeen.get(i).get(i1).getPrice()+"");
        //调用自定义加减器里的方法设置Number
        adv.setNumber(childBeen.get(i).get(i1).getNum());

        //自定义加减器里的接口 加和减
        adv.setOnAddDelClickListener(new AddDeleteView.OnAddDelClickListener() {
            @Override//加
            public void onAddClick(View v) {
                int number = adv.getNumber();
                number++;
                adv.setNumber(number);
                childBeen.get(i).get(i1).setNum(number);
                changesum(childBeen);
            }

            @Override//减
            public void onDelClick(View v) {
                int number = adv.getNumber();
                number--;
                adv.setNumber(number);
                childBeen.get(i).get(i1).setNum(number);
                changesum(childBeen);
            }
        });

        //二级组的复选框监听
        childCb.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //定义一个默认flag
                boolean flag=false;
                //获得当前二级列表复选框的状态
                boolean cchecked = childCb.isChecked();
                //把当前状态存储到二级列表List集合里面
                childBeen.get(i).get(i1).setChildCb(cchecked);

                //循环遍历二级列表List集合
                for (List<ChildBean> i1:childBeen){
                    // 按照所有二级列表的item的个数进行循环遍历
                    for(int r=0;r<i1.size();r++) {
                        //获取当前二级列表的状态
                        boolean childCb1 = i1.get(r).isChildCb();
                        //取反设置 如果为true改为false 如果为false改为true
                        if(!childCb1){
                            //如果当前二级列表中有一条复选框是false  全选为false
                            allCheckbox.setChecked(false);
                            //如果当前二级列表中有一条复选框是false  一级列表为false
                            groupBeen.get(i).setGropuCb(false);

                            //flag为true跳出循环
                            flag=true;
                            break;
                        }else{
                            //如果所有的二级列表都为true  全选为true
                            allCheckbox.setChecked(true);
                            //如果所有的二级列表都为true  一级列表为true
                            groupBeen.get(i).setGropuCb(true);
                        }
                    }
                    //falg为true时跳出循环
                    if(flag){
                        break;
                    }
                }
                //当前二级列表的总长度
                int size = childBeen.get(i).size();
                //按照当前二级列表的总长度循环
                for(int x=0;x<size;x++) {
                    //获得当前二级列表中每一个item的选中状态
                    boolean childCb1 = childBeen.get(i).get(x).isChildCb();
                    //判断
                    if(!childCb1){
                        //有一个flase 一级列表就设置false  跳出循环
                        groupBeen.get(i).setGropuCb(false);
                        break;
                    }else{

                        groupBeen.get(i).setGropuCb(true);
                    }
                }
                //刷新适配器
                notifyDataSetChanged();
                //计算价格
               changesum(childBeen);
            }
        });


        return v;
    }

    @Override
    public boolean isChildSelectable(int i, int i1) {
        return false;
    }
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值