购物车二级列表联动以及价格计算

本文详细介绍了如何实现一个购物车功能,包括店铺和商品的多级联动选择,以及总价和数量的实时计算。通过在Bean类中添加标识,利用RecyclerView的嵌套和自定义适配器,实现了店铺CheckBox选中时选中该店铺所有商品,底部全选框控制所有商品的选择状态。同时,通过接口回调更新UI,确保加减器与总价、数量的同步更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先展示一波效果图(如下)
功能效果:当点击店铺的CheckBox时候,选中此店铺中的所有商品。当点击底部全选框,选中所有店铺和其中的商品,底部价格和数量随着选中商品的数量改变而改变。
在这里插入图片描述
第一步:初始化布局页面、数据
布局使用的是两个RecyclerView嵌套,一个是店铺,一个是商品,底部全选框,价格和数量的文本框,在activity中分别初始化
1、在购物车bean类(商品数据下)中加入标识,并设置Getter和Setter方法

            //解决checkBox位置错乱
            private boolean isCheck;
            public boolean isCheck() {
                return isCheck;
            }
            public void setCheck(boolean check) {
                isCheck = check;
            }

2、创建购物车数据为泛型的ArrayList集合,用于存放数据

 List<ShoppingCartBean.OrderDataBean> list = new ArrayList<>();

3、存放数据,以及recyclerView设置布局管理器

            //集合添加数据
            list.addAll(((ShoppingCartBean) o).getOrderData());
            adapter = new MyAdapter(list, MyApplication.context);
            //设置适配器
            recyclerView.setAdapter(adapter);
            //设置布局管理器                                        此处为全局上下文
            recyclerView.setLayoutManager(new LinearLayoutManager(MyApplication.context));

4、自定义控件 加减器(我直接定义了三个TextView分别作为“+”,“商品数量,”“-”)

    //设置数量(子适配器调用)
    public void setCountText(int counts) {
        countText.setText(counts+"");
    }
    //加减器接口回调
    public interface Numberinter{
        void setNumber(int number);
    }
    private Numberinter numberinter;
    public void setNumberinter(Numberinter numberinter) {
        this.numberinter = numberinter;
    }
    //设置加减器点击事件
    @OnClick({R.id.add_text, R.id.remove_text})
    public void onViewClicked(View view) {
        int number= Integer.parseInt(countText.getText().toString());
        switch (view.getId()) {
            case R.id.add_text:
                number++;
                countText.setText(number+"");
                if (numberinter!=null){
                    numberinter.setNumber(number);
                }
                break;
            case R.id.remove_text:
                if (number>=2){
                    number--;
                    countText.setText(number+"");
                    if (numberinter!=null){
                        numberinter.setNumber(number);
                    }
                }else {
                    Toast.makeText(getContext(), "已经是最小数了", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }

第二步:适配器
同样有两个RecyclerView适配器,一个父适配器(店铺),一个子适配器(商品),子适配器直接以内部类的形式存放在父适配器中
1、接口回调

    //设置接口回调 Activity中调用
    public interface MyInter {
        //点击商家的checkbox
        void setGroupClick(int Index);
        //点击商品的checkbox
        void setClick(int Index, int childIndex);
        //点击加减器
        void setAddClick(int Index, int childIndex, int number);
    }
    private MyInter myInter;
    public void setMyInter(MyInter myInter) {
        this.myInter = myInter;
    }

2、父适配器的 onBindViewHolder

       //设置店铺名
        holder.groupName.setText(list.get(position).getShopName());
        //店铺商品设置布局管理
        holder.childRecy.setLayoutManager(new LinearLayoutManager(context));
        //给列表设置子适配器(第一个参数为数据集合,第二个参数为所点击的位置在子适配器中为Index) 
        ChilAdapter chilAdapter=new ChilAdapter(list.get(position).getCartlist(),position);
        holder.childRecy.setAdapter(chilAdapter);
        //设置店铺选框点击事件
        holder.groupCheckbox.setChecked(setGroupChecked(position));
        holder.groupCheckbox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //接口回调
                if (myInter!=null){
                    myInter.setGroupClick(position);
                }
            }
        });

3、子适配器
3.1、父适配器传过来的参数进行有参构造

        private List<ShoppingCartBean.OrderDataBean.CartlistBean> list;
        //传过来所点击的坐标
        private int Index;

        public ChilAdapter(List<ShoppingCartBean.OrderDataBean.CartlistBean> list, int index) {
            this.list = list;
            Index = index;
        }

3.2、子适配器onBindViewHolder

            //给商品条目设置数据
            holder.chileImage.setImageURI(list.get(position).getDefaultPic());
            holder.commodityName.setText(list.get(position).getProductName()+"");
            holder.commodityPrice.setText(list.get(position).getPrice()+"");
            //设置选框是否选中
            holder.childCheckBox.setChecked(list.get(position).isCheck());
            //设置商品数量(调用自定义加减器中方法)
            holder.jiajian.setCountText(list.get(position).getCount());
            //checkbox设置点击监听事件
            holder.childCheckBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (myInter!=null){
                        myInter.setClick(Index,position);
                    }
                }
            });
            //设置加减器改变商品数量
            holder.jiajian.setNumberinter(new AddAndroidRemove.Numberinter() {
                @Override
                public void setNumber(int number) {
                    if (myInter!=null){
                        myInter.setAddClick(Index,position,number);
                    }
                }
            });

3.3、店铺选框

    //判断店铺groupCheckebox是否选中
    public boolean setGroupChecked(int Index){
        boolean b=true;
        List<ShoppingCartBean.OrderDataBean.CartlistBean> cartlist=list.get(Index).getCartlist();
        for (int i=0;i<cartlist.size();i++){
            ShoppingCartBean.OrderDataBean.CartlistBean cartlistBean=cartlist.get(i);
            if (!cartlistBean.isCheck()){
                b=false;
                break;
            }
        }
        return b;
    }
    //点击店铺选框groupCheckebox
    public void setGroupCheck(int index,boolean b){
        List<ShoppingCartBean.OrderDataBean.CartlistBean> cartlist=list.get(index).getCartlist();
        for (int i=0;i<cartlist.size();i++){
            cartlist.get(i).setCheck(b);
        }
    }

3.4、商品选框

//判断商品有没有被选中
    public boolean ChildCheck(int Index,int childIndex){
        return list.get(Index).getCartlist().get(childIndex).isCheck();
    }
    //点击商品选框
    public void setChildCheck(int Index,int childIndex,boolean b){
        list.get(Index).getCartlist().get(childIndex).setCheck(b);
    }

3.5、底部全选框

//判断全选(判断所有产品是否都被选中)
    public boolean isAllCheck(){
        boolean b=true;
        for (int i=0;i<list.size();i++){
            for (int j=0;j<list.get(i).getCartlist().size();j++){
                ShoppingCartBean.OrderDataBean.CartlistBean cartlistBean
                        =list.get(i).getCartlist().get(j);
                if (!cartlistBean.isCheck()){
                    b=false;
                    break;
                }
            }
        }
        return b;
    }
    //全部选中
    public void setAllCheck(boolean b){
        for (int i=0;i<list.size();i++){
            for (int j=0;j<list.get(i).getCartlist().size();j++){
                ShoppingCartBean.OrderDataBean.CartlistBean cartlistBean
                        =list.get(i).getCartlist().get(j);
                cartlistBean.setCheck(b);
            }
        }
    }

3.6、计算总价和数量

//计算价格
    public int getAllprice(){
        int number=0;
        for (int i=0;i<list.size();i++){
            for (int j=0;j<list.get(i).getCartlist().size();j++){
                ShoppingCartBean.OrderDataBean.CartlistBean cartlistBean
                        =list.get(i).getCartlist().get(j);
                if (cartlistBean.isCheck()){
                    number+=cartlistBean.getPrice()*cartlistBean.getCount();
                }
            }
        }
        return number;
    }
    //所有商品数量
    public int getAllcount(){
        int number=0;
        for (int i=0;i<list.size();i++){
            for (int j=0;j<list.get(i).getCartlist().size();j++){
                ShoppingCartBean.OrderDataBean.CartlistBean cartlistBean
                        =list.get(i).getCartlist().get(j);
                if (cartlistBean.isCheck()){
                    number+=cartlistBean.getCount();
                }
            }
        }
        return number;
    }

第三步:Activity调用适配器(这一步比较简单,都是直接调用适配器中的方法)
1、点击全选以及自动计算价格和数量(上面初始化Adapter,以下为直接调用)

//点击全选事件
    @OnClick(R.id.all_check)
    public void onViewClicked() {
        boolean checkAll=adapter.isAllCheck();
        adapter.setAllCheck(!checkAll);
        //刷新状态
        adapter.notifyDataSetChanged();
        //计价
        caush();
    }
    public void check(){
        boolean checkAll=adapter.isAllCheck();
        allCheck.setChecked(checkAll);
    }
    //计算总价
    public void caush(){
        allCount.setText(adapter.getAllcount()+"");
        allPrice.setText(adapter.getAllprice()+"");
    }

2、店铺、商品和价格、数量的联动

        //店铺选框
        adapter.setMyInter(new MyAdapter.MyInter() {
            @Override
            public void setGroupClick(int Index) {
                boolean b = adapter.setGroupChecked(Index);
                adapter.setGroupCheck(Index, !b);
                adapter.notifyDataSetChanged();
                //全选
                check();
                //计价
                caush();
            }
            //商品选框
            @Override
            public void setClick(int Index, int childIndex) {
                boolean c = adapter.ChildCheck(Index, childIndex);
                adapter.setChildCheck(Index, childIndex, !c);
                adapter.notifyDataSetChanged();
                //全选
                check();
                //计价
                caush();
            }
            //加减器
            @Override
            public void setAddClick(int Index, int childIndex, int number) {
                list.get(Index).getCartlist().get(childIndex).setCount(number);
                //计价
                caush();
            }
        });

此功能主要由接口回调实现,最重要的一个细节就是在Bean类中添加标识。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值