二级购物车实现(展示,全选,反选,自定义view加减器)

1.主布局

http://172.17.8.100/ks/product/getCarts?uid=51

mainactivity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical"
    >
    <android.support.v7.widget.RecyclerView
        android:id="@+id/rec"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="9"
        ></android.support.v7.widget.RecyclerView>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal"
        >
        <CheckBox
            android:id="@+id/checkall"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:text="全选/反选"
            />
        <TextView
            android:id="@+id/price"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="总价"
            />
        <Button
            android:id="@+id/qjs_btn"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="去结算"
            />
    </LinearLayout>
</LinearLayout>

2.商家布局

groupitem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
   <LinearLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:orientation="horizontal"
       >
       <CheckBox
           android:id="@+id/group_checkbox"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           />
       <TextView
           android:id="@+id/group_name"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="我是商家1"
           android:layout_marginLeft="10dp"
           />
   </LinearLayout>
    <android.support.v7.widget.RecyclerView
        android:id="@+id/childrec"
        android:layout_marginLeft="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</LinearLayout>

3.商品布局

childitem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >
    <CheckBox
        android:id="@+id/child_checkbox"
        android:layout_width="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="30dp"
        android:layout_height="wrap_content" />
    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/child_img"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_marginLeft="10dp"
        />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
        <TextView
            android:id="@+id/child_name"
            android:layout_marginTop="20dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:text="锤子"
            />
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            >
            <TextView
                android:layout_marginTop="10dp"
                android:id="@+id/child_price"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="价格:"
                />
            <com.example.yuemoni4.MyView
                android:id="@+id/myviews"
                android:layout_marginLeft="20dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"></com.example.yuemoni4.MyView>
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

4.自定义加减器布局

myviewitem.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    >
  <Button
      android:id="@+id/myview_add"
      android:layout_width="30dp"
      android:layout_height="wrap_content"
      android:text="+"
      />
    <EditText
        android:id="@+id/myview_num"
        android:layout_width="30dp"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/myview_jian"
        android:layout_width="30dp"
        android:layout_height="wrap_content"
        android:text="-"
        />
</LinearLayout>

5.定义MyView类

MyView

public class MyView extends LinearLayout {
    private Button myview_add,myview_jian;
    private EditText myview_num;
    private List<ShopBean.DataBean.ListBean> childlist;
    private ChildAdapter childAdapter;
    //定义数量的变化值
    private int nums;
    private int i;
    public MyView(Context context) {
        super(context);
    }

    public MyView(final Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.myviewitem,this);
        myview_add=findViewById(R.id.myview_add);
        myview_jian=findViewById(R.id.myview_jian);
        myview_num=findViewById(R.id.myview_num);
       //设置add的点击事件 点击add改变num的值
        myview_add.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击add  数量+1
                nums++;
                //将变化的值设置给输入框
                myview_num.setText(nums+"");
                //给子条目设置变化值
                childlist.get(i).setNum(nums);
                //接口调用
                if(myViewListener!=null){
                    myViewListener.onMyView();
                }
                childAdapter.notifyDataSetChanged();
            }
        });
        //设置jian的点击事件 点击jian改变nums的值
        myview_jian.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //进行判断 如果num<=1则提示不能再减了
                if(nums<=1){
                    Toast.makeText(context, "不能再减了", Toast.LENGTH_SHORT).show();
                }else {
                    nums--;
                    myview_num.setText(nums+"");
                    childlist.get(i).setNum(nums);
                    if(myViewListener!=null){
                        myViewListener.onMyView();
                    }
                    childAdapter.notifyDataSetChanged();
                }
            }
        });

    }

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

    public void setData(ChildAdapter childAdapter, List<ShopBean.DataBean.ListBean> childlist, int i) {
        this.childAdapter=childAdapter;
        this.childlist=childlist;
        this.i=i;
       nums= childlist.get(i).getNum();
       myview_num.setText(childlist.get(i).getNum()+"");

    }

    //定义接口为了方便商品适配器来调取
    public interface onMyViewListener{
        void onMyView();
    }
    onMyViewListener myViewListener;

    public void setMyViewListener(onMyViewListener myViewListener) {
        this.myViewListener = myViewListener;
    }
}

6.商品适配器

ChildAdapter

public class ChildAdapter extends RecyclerView.Adapter<ChildAdapter.ViewHolder> {
    private Context context;
    private List<ShopBean.DataBean.ListBean> childlist;

    public ChildAdapter(Context context, List<ShopBean.DataBean.ListBean> childlist) {
        this.context = context;
        this.childlist = childlist;
    }

    @NonNull
    @Override
    public ChildAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.childitem, viewGroup, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull ChildAdapter.ViewHolder viewHolder, final int i) {
              viewHolder.child_checkbox.setChecked(childlist.get(i).isChildChecked());
              viewHolder.child_name.setText(childlist.get(i).getTitle());
              viewHolder.child_price.setText(childlist.get(i).getPrice()+"");
        AbstractDraweeController controller = Fresco.newDraweeControllerBuilder()
                .setUri(childlist.get(i).getImages())
                .build();
        viewHolder.child_img.setController(controller);
        //调用自定义view加减器内的方法为了获取每个商品条目中的商品个数
        viewHolder.myviews.setData(this,childlist,i);
                //调取自定义view的监听事件接口
                viewHolder.myviews.setMyViewListener(new MyView.onMyViewListener() {
                    @Override
                    public void onMyView() {
                if(childListener!=null){
                    childListener.onChild();
                }
            }
        });
                //子条目复选框状态变化  商家复选框也会跟随变化
        //点击子条目复选框获取到选中状态,进行调用  方便商家适配器调用
         viewHolder.child_checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                 childlist.get(i).setChildChecked(isChecked);
                 if(childListener!=null){
                     childListener.onChild();
                 }
             }
         });

    }

    @Override
    public int getItemCount() {
        return childlist.size();
    }
    //设置循环遍历商品的选中状态
    public void setChecked(boolean checked){
        for (int i = 0; i <childlist.size() ; i++) {
            childlist.get(i).setChildChecked(checked);
        }
        notifyDataSetChanged();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private CheckBox child_checkbox;
        private SimpleDraweeView child_img;
        private TextView child_name;
        private TextView child_price;
        private MyView myviews;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            child_checkbox=itemView.findViewById(R.id.child_checkbox);
            child_img=itemView.findViewById(R.id.child_img);
            child_name=itemView.findViewById(R.id.child_name);
            child_price=itemView.findViewById(R.id.child_price);
            myviews=itemView.findViewById(R.id.myviews);
        }
    }
    //定义商品的接口 方便在商家适配器里面调取
     public interface onChildListener{
        void onChild();
    }
    onChildListener childListener;

    public void setChildListener(onChildListener childListener) {
        this.childListener = childListener;
    }
}

7.商家的适配器

GroupAdapter

public class GroupAdapter extends RecyclerView.Adapter<GroupAdapter.ViewHolder> {
    private Context context;
    private List<ShopBean.DataBean> grouplist;

    public GroupAdapter(Context context, List<ShopBean.DataBean> grouplist) {
        this.context = context;
        this.grouplist = grouplist;
    }

    @NonNull
    @Override
    public GroupAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.groupitem, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull final GroupAdapter.ViewHolder viewHolder, final int i) {
        //获取商家数据
       viewHolder.group_checkbox.setChecked(grouplist.get(i).isGroupChecked());
       viewHolder.group_name.setText(grouplist.get(i).getSellerName());
       //调取子布局条目
        final List<ShopBean.DataBean.ListBean> childlist = grouplist.get(i).getList();
        //设置子条目适配器
        final ChildAdapter childAdapter = new ChildAdapter(context, childlist);
        viewHolder.childrec.setAdapter(childAdapter);
        //设置布局
        viewHolder.childrec.setLayoutManager(new LinearLayoutManager(context));
        //商品控制商家
        //点击内部商品的复选框状态控制商家的复选框状态
        //当商品的复选框为全部选中   改变商家的复选框状态值
        childAdapter.setChildListener(new ChildAdapter.onChildListener() {
            @Override
            public void onChild() {
                if(groupListener!=null){
                    groupListener.onGroup(grouplist);
                }
                //设置默认为true
                boolean isChecked=true;
                //进行循环遍历商品
                for (int j = 0; j <childlist.size() ; j++) {
                    //获取商品条目的状态值
                    boolean childChecked = childlist.get(j).isChildChecked();
                    //进行判断状态值 如果未选中,将状态设置未false
                    if(!childChecked){
                        isChecked=false;
                        break;
                    }
                }
                //设置商家复选框的值
                viewHolder.group_checkbox.setChecked(isChecked);
                 //获取商家的条目进行设置状态值
                grouplist.get(i).setGroupChecked(isChecked);
            }
        });
        //商家控制商品 的点击事件
        //点击商家
        viewHolder.group_checkbox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击商家设置状态
             viewHolder.group_checkbox.setChecked(viewHolder.group_checkbox.isChecked());
             //控制商品
                childAdapter.setChecked(viewHolder.group_checkbox.isChecked());
            }
        });

    }

    @Override
    public int getItemCount() {
        return grouplist.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView group_name;
        private CheckBox group_checkbox;
        private RecyclerView childrec;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            group_name=itemView.findViewById(R.id.group_name);
            group_checkbox=itemView.findViewById(R.id.group_checkbox);
            childrec=itemView.findViewById(R.id.childrec);
        }
    }
    //设置商家的接口  为了在主页面调取数据用
    public interface onGroupListener{
        void onGroup(List<ShopBean.DataBean> data);
    }
    onGroupListener groupListener;

    public void setGroupListener(onGroupListener groupListener) {
        this.groupListener = groupListener;
    }
}

8.主页面全选反选

Mainactivity

public class MainActivity extends AppCompatActivity implements IShopView {

    @BindView(R.id.rec)
    RecyclerView rec;
    @BindView(R.id.price)
    TextView price;
    @BindView(R.id.qjs_btn)
    Button qjsBtn;
    @BindView(R.id.checkall)
    CheckBox checkall;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        //连接p层
        ShopPresenter shopPresenter = new ShopPresenter(this);
        shopPresenter.getShopPresenter();
        //设置布局
        rec.setLayoutManager(new LinearLayoutManager(this));
    }

    @Override
    public void getShopView(ShopBean shopBean) {
        //设置适配器
        //获取商家条目
        final List<ShopBean.DataBean> grouplist = shopBean.getData();
        //删除第一条商家所有数据
        grouplist.remove(0);
        final GroupAdapter groupAdapter = new GroupAdapter(this, grouplist);
        rec.setAdapter(groupAdapter);
        //进行全选反选
        //点击全选的点击事件
      checkall.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              //定义一个变化的总价
              int sumPrice=0;
              //获取复选框选中的状态
              boolean b = ((CheckBox) v).isChecked();
              //进行判断
              //如果全选
              if(b){
                  //进行循环遍历商家的复选框
                  for (int i = 0; i <grouplist.size() ; i++) {
                      //将全部的商家复选框设置为true
                      grouplist.get(i).setGroupChecked(true);
                      //获取商品
                      List<ShopBean.DataBean.ListBean> childlist = grouplist.get(i).getList();
                      //进行遍历商品
                      for (int j = 0; j <childlist.size() ; j++) {
                          //将全部的商品复选框状态设置为true
                          childlist.get(j).setChildChecked(true);
                          //计算总价
                         sumPrice += childlist.get(j).getPrice()*childlist.get(j).getNum();
                      }

                  }
              }else {
                  //进行反选
                  //进行遍历商家的复选框
                  for (int i = 0; i <grouplist.size() ; i++) {
                      grouplist.get(i).setGroupChecked(false);
                      List<ShopBean.DataBean.ListBean> childlist = grouplist.get(i).getList();
                      for (int j = 0; j <childlist.size() ; j++) {
                          childlist.get(j).setChildChecked(false);

                      }
                  }
              }
              groupAdapter.notifyDataSetChanged();
              price.setText("总价"+sumPrice+"");

          }
      });
      //商品和商家控制全选反选
        groupAdapter.setGroupListener(new GroupAdapter.onGroupListener() {
            @Override
            public void onGroup(List<ShopBean.DataBean> data) {
                int sumPrice=0;
                //将状态值默认设置为true
                boolean isChecked=true;
                //循环遍历商家条目
                for (int i = 0; i <grouplist.size() ; i++) {
                    //获取子条目
                    List<ShopBean.DataBean.ListBean> childlist = grouplist.get(i).getList();
                    //循环遍历子条目
                    for (int j = 0; j <childlist.size() ; j++) {
                        if(childlist.get(j).isChildChecked()){
                            sumPrice += childlist.get(j).getPrice()*childlist.get(j).getNum();
                        }else {
                            isChecked=false;
                        }
                    }
                }
                //点击全选为选中
                checkall.setChecked(isChecked);
                //修改值
                price.setText("总价"+sumPrice+"");
            }
        });

    }
}

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值