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