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

    科技2024-05-12  101

    先展示一波效果图(如下) 功能效果:当点击店铺的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类中添加标识。

    Processed: 0.009, SQL: 8