购物车+自定义加减+全选和全不选

依赖

    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.github.bumptech.glide:glide:4.9.0'

记得不要忘记加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

接下 MVP框架
view包下的MainView接口

package com.yuekaodemo1.mvp.view;

public interface MainView {

         //成功
    void  success(int type,String data);
         //失败
    void  fail(int type,String error);

}

model层的MainModel的接口

package com.yuekaodemo1.mvp.model;

public interface MainModel {


         interface OnCallBacklistener{
             void  success(int type,String data);

             void fail(int type,String error);
         }

          void doShoppCar(int type,String url, OnCallBacklistener listener);
}

创建MainModelmI继承MainModel接口

package com.yuekaodemo1.mvp.model;

import android.os.Handler;
import android.os.Message;

import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainModelmI implements MainModel{
       private OnCallBacklistener listener;
        private int type;
    @Override
    public void doShoppCar(int type, String url, OnCallBacklistener listener) {
        this.listener = listener;
        this.type = type;
        //请求数据

        OkHttpClient okHttpClient = new OkHttpClient();
        final Request request = new Request.Builder().url(url).build();

        final Message message = Message.obtain();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                   message.what = 1001;
                   message.obj = e.getMessage();
                  handler.sendMessage(message);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                      message.what = 1000;
                       message.obj = response.body().string();
                       handler.sendMessage(message);
            }
        });
    }

    private Handler handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 1000){
                     String data = (String) msg.obj;
                     listener.success(type,data);
            }else {
                //失败
                String error = (String) msg.obj;
                listener.fail(type,error);
            }
        }
    };
}

presenter层中的MainPresenter接口

package com.yuekaodemo1.mvp.presenter;

public interface MainPresenter {

      void  ShoopCar(int type,String url);
}

创建MainPresenterImI继承MainPresenter接口

package com.yuekaodemo1.mvp.presenter;

import com.yuekaodemo1.mvp.model.MainModel;
import com.yuekaodemo1.mvp.view.MainView;

public class MainPresenterImI implements MainPresenter, MainModel.OnCallBacklistener {
    private MainModel mainModel;
      private MainView mainView;

    public MainPresenterImI(MainModel mainModel, MainView mainView) {
        this.mainModel = mainModel;
        this.mainView = mainView;
    }

    @Override
    public void ShoopCar(int type, String url) {

                mainModel.doShoppCar(type,url,this);
    }

    @Override
    public void success(int type, String data) {
              mainView.success(type,data);
    }

    @Override
    public void fail(int type, String error) {
            mainView.fail(type,error);
    }

     public void destory(){
        if (mainModel != null){
            mainModel = null;
        }if (mainView !=null){
            mainView = null;
         }
              System.gc();
     }
}

主布局mainview

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

      <android.support.v7.widget.RecyclerView
          android:id="@+id/recycler"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:layout_above="@+id/layout"
           />

          <RelativeLayout
              android:id="@+id/layout"
              android:layout_alignParentBottom="true"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">

                <CheckBox
                    android:id="@+id/check_all"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true"
                    android:text="全选"/>

                <TextView
                    android:id="@+id/tv_allprice"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_toRightOf="@+id/check_all"
                    android:layout_marginLeft="10dp"
                    android:layout_centerVertical="true"
                    android:text="合计:"/>

              <RelativeLayout
                  android:layout_alignParentRight="true"
                  android:layout_width="100dp"
                  android:layout_height="50dp"
                  android:background="#d43c3c">

                    <TextView
                        android:id="@+id/tv_move"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerInParent="true"
                        android:textColor="#ffff"
                        android:text="去结算:"/>
              </RelativeLayout>
          </RelativeLayout>
</RelativeLayout>

商家的布局adapter_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">


         <RelativeLayout
             android:id="@+id/layout"
             android:layout_width="match_parent"
             android:layout_height="30dp">

               <CheckBox
                   android:id="@+id/checkbox"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:layout_centerVertical="true"/>

               <TextView
                   android:id="@+id/tv_title"
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:layout_centerVertical="true"
                   android:layout_toRightOf="@+id/checkbox"/>
         </RelativeLayout>
    
              <android.support.v7.widget.RecyclerView
                  android:id="@+id/recycler"
                  android:layout_below="@+id/layout"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"/>

</RelativeLayout>

商品信息的布局adapter_item_child.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">


    <RelativeLayout
        android:id="@+id/layout"
        android:layout_width="match_parent"
        android:layout_height="100dp">

        <CheckBox
            android:id="@+id/checkbox"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true" />

        <ImageView
            android:id="@+id/iv_shop"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:layout_toRightOf="@+id/checkbox" />

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_toRightOf="@+id/iv_shop">

            <TextView
                android:id="@+id/tv_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true">

                <TextView
                    android:id="@+id/tv_price"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textColor="#d43c3c" />

                <!--自定义加减器-->
                <com.yuekaodemo1.view.ShopCarAddView
                    android:id="@+id/shop_car_view"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true" />
            </RelativeLayout>

        </RelativeLayout>


    </RelativeLayout>

</RelativeLayout>

自定义加减的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">


    <RelativeLayout
        android:id="@+id/layout"
        android:layout_width="wrap_content"
        android:layout_height="30dp">

        <TextView
            android:id="@+id/tv_jian"
            android:layout_width="30dp"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:text="-" />

        <EditText
            android:id="@+id/ed_shop"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/tv_jian"
            android:background="@drawable/ed_bg"
            android:inputType="number"
            />

        <TextView
            android:id="@+id/tv_add"
            android:layout_width="30dp"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/ed_shop"
            android:gravity="center_horizontal"
            android:text="+" />
    </RelativeLayout>
</RelativeLayout>

drawable层的颜色属性ed_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="#e8e8e8"/>
</shape>

自定义ShopCarAddView函数

package com.yuekaodemo1.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.yuekaodemo1.R;

public class ShopCarAddView extends LinearLayout implements View.OnClickListener {
    private EditText mEdit;
    private Context context;

    public ShopCarAddView(Context context) {
        super(context);
        init(context);
    }

    public ShopCarAddView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }
    private void init(Context context) {
      this.context=context;
        View view = View.inflate(context, R.layout.shop_car_add_view,null);
        mEdit=(EditText)view.findViewById(R.id.ed_shop);
         view.findViewById(R.id.tv_jian).setOnClickListener(this);
         view.findViewById(R.id.tv_add).setOnClickListener(this);
        addView(view);
    }

    
    public void setNum(int num) {

        //设置数量

          mEdit.setText(num+"");
    }

    @Override
    public void onClick(View v) {
               switch (v.getId()){

                       case R.id.tv_add:
                           String numStringAdd = mEdit.getText().toString().trim();

                           int numAdd = Integer.parseInt(numStringAdd);
                           numAdd++;
                           if (mOnNumCallBackListener!=null){
                                  mOnNumCallBackListener.num(numAdd);
                           }
                           mEdit.setText(numAdd+"");
                           break;

                   case R.id.tv_jian:
                       String numString = mEdit.getText().toString().trim();

                       int num= Integer.parseInt(numString);
                       if (num<=1){

                           Toast.makeText(context,"商品最少为一件",Toast.LENGTH_LONG).show();
                           return;
                       }
                       if (mOnNumCallBackListener!=null){
                             mOnNumCallBackListener.num(num);
                       }
                       num--;
                       mEdit.setText(num+"");
                       break;
               }
    }

       private OnNumCallBackListener mOnNumCallBackListener;
        public void setOnNumCallBackListener(OnNumCallBackListener mOnNumCallBackListener){
            this.mOnNumCallBackListener=mOnNumCallBackListener;
        }
    public interface OnNumCallBackListener{

                     void num(int num);
    }
}

bean层中的ShopCarBean

package com.yuekaodemo1.bean;

import java.util.List;

public class ShopCarBean {

        private List<DataBean> data;

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public class DataBean{

              private List<ListBean> list;
               private String sellerName;
               private boolean checked;

        public boolean isChecked() {
            return checked;
        }

        public void setChecked(boolean checked) {
            this.checked = checked;
        }

        public List<ListBean> getList() {
                return list;
            }

            public void setList(List<ListBean> list) {
                this.list = list;
            }

            public String getSellerName() {
                return sellerName;
            }

            public void setSellerName(String sellerName) {
                this.sellerName = sellerName;
            }

            public class ListBean{

                     private String images;
                     private String title;
                     private float price;
                     private  int num;
                    private boolean checked;

                public boolean isChecked() {
                    return checked;
                }

                public void setChecked(boolean checked) {
                    this.checked = checked;
                }

                public String getImages() {
                      return images;
                  }

                  public void setImages(String images) {
                      this.images = images;
                  }

                  public String getTitle() {
                      return title;
                  }

                  public void setTitle(String title) {
                      this.title = title;
                  }

                  public float getPrice() {
                      return price;
                  }

                  public void setPrice(float price) {
                      this.price = price;
                  }

                  public int getNum() {
                      return num;
                  }

                  public void setNum(int num) {
                      this.num = num;
                  }
              }
        }
}

adapter层中商家的适配器ShopCarAdapter

package com.yuekaodemo1.adapter;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;

import com.yuekaodemo1.R;
import com.yuekaodemo1.bean.ShopCarBean;
import com.yuekaodemo1.mvp.model.MainModel;

import java.util.ArrayList;
import java.util.List;

public class ShopCarAdapter extends RecyclerView.Adapter<ShopCarAdapter.ShopCarViewHolder> {

    private Context context;
    private List<ShopCarBean.DataBean> list = new ArrayList<>();

    public ShopCarAdapter(Context context) {
        this.context = context;
    }

    @NonNull
    @Override
    public ShopCarAdapter.ShopCarViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = View.inflate(context, R.layout.adapter_item, null);
        ShopCarViewHolder shopCarViewHolder = new ShopCarViewHolder(view);
        return shopCarViewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull final ShopCarAdapter.ShopCarViewHolder shopCarViewHolder, final int i) {
              shopCarViewHolder.mTitle.setText(list.get(i).getSellerName());

                shopCarViewHolder.mCheckBox.setChecked(list.get(i).isChecked());
        final List<ShopCarBean.DataBean.ListBean> listShop = list.get(i).getList();
        final ShopCarItemAdapter shopCarItemAdapter = new ShopCarItemAdapter(context,listShop);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
          linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
             shopCarViewHolder.mRecycler.setLayoutManager(linearLayoutManager);
              shopCarViewHolder.mRecycler.setAdapter(shopCarItemAdapter);


               shopCarItemAdapter.setOnCallBackListener(new ShopCarItemAdapter.OnCallBackListener() {
                   @Override
                   public void changeData(List<ShopCarBean.DataBean.ListBean> listShop) {

                          int checkedNum=0;
                       for (int i = 0; i <listShop.size() ; i++) {

                         boolean  checked= listShop.get(i).isChecked();
                         if (checked){

                              checkedNum++;
                         }
                       }
                       if (checkedNum==listShop.size()){
                           shopCarViewHolder.mCheckBox.setChecked(true);
                       }else{
                           shopCarViewHolder.mCheckBox.setChecked(false);
                       }
                       if (mOnCallBackListener!=null){

                           mOnCallBackListener.changeData(list);
                       }
                   }
               });

              shopCarViewHolder.mCheckBox.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {

                      boolean  isChecked = shopCarViewHolder.mCheckBox.isChecked();
                           list.get(i).setChecked(isChecked);
                      List<ShopCarBean.DataBean.ListBean> listShop = list.get(i).getList();
                      for (int i = 0; i <listShop.size() ; i++) {

                                listShop.get(i).setChecked(isChecked);
                      }

                                 if (mOnCallBackListener!=null){
                                           mOnCallBackListener.changeData(list);
                                 }
                         notifyItemChanged(i);
                  }
              });
    }

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

    public void setlist(List<ShopCarBean.DataBean> list) {
        this.list=list;
        notifyDataSetChanged();
    }

    public class ShopCarViewHolder extends RecyclerView.ViewHolder {
         TextView mTitle;
           RecyclerView mRecycler;
           CheckBox mCheckBox;
        public ShopCarViewHolder(@NonNull View itemView) {
            super(itemView);
              mTitle=(TextView)itemView.findViewById(R.id.tv_title);
              itemView.findViewById(R.id.check_all);
             mRecycler =(RecyclerView) itemView.findViewById(R.id.recycler);
             mCheckBox = (CheckBox)itemView.findViewById(R.id.checkbox);
        }
    }

        private OnCallBackListener mOnCallBackListener;
      public void setOnCallBackListener(OnCallBackListener mOnCallBackListener){
             this.mOnCallBackListener=mOnCallBackListener;
      }

    public interface OnCallBackListener{

           void  changeData(List<ShopCarBean.DataBean>list);
    }
}

商品信息的适配器ShopCarItemAdapter

package com.yuekaodemo1.adapter;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.yuekaodemo1.R;
import com.yuekaodemo1.bean.ShopCarBean;
import com.yuekaodemo1.view.ShopCarAddView;

import java.util.ArrayList;
import java.util.List;

public class ShopCarItemAdapter extends RecyclerView.Adapter<ShopCarItemAdapter.ShopCarItemViewHolder> {
    private Context context;
    private List<ShopCarBean.DataBean.ListBean>listShop = new ArrayList<>();
    public ShopCarItemAdapter(Context context, List<ShopCarBean.DataBean.ListBean> listShop) {
           this.context=context;
           this.listShop=listShop;
    }

    @NonNull
    @Override
    public ShopCarItemAdapter.ShopCarItemViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
           View view = View.inflate(context,R.layout.adapter_item_child,null);
           ShopCarItemViewHolder shopCarItemViewHolder = new ShopCarItemViewHolder(view);
        return shopCarItemViewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull final ShopCarItemAdapter.ShopCarItemViewHolder shopCarItemViewHolder, final int i) {
                //shopCarItemViewHolder.mImage
        Glide.with(context).load(listShop.get(i).getImages()).into(shopCarItemViewHolder.mImage);
        shopCarItemViewHolder.mTitle.setText(listShop.get(i).getTitle());
        shopCarItemViewHolder.mPrice.setText(listShop.get(i).getPrice()+"");
        shopCarItemViewHolder.mCheckBox.setChecked(listShop.get(i).isChecked());

          shopCarItemViewHolder.mShopCarAddView.setNum(listShop.get(i).getNum());

          shopCarItemViewHolder.mShopCarAddView.setOnNumCallBackListener(new ShopCarAddView.OnNumCallBackListener() {
              @Override
              public void num(int num) {
                 listShop.get(i).setNum(num);

                if (listener!=null){
                    listener.changeData(listShop);
                }
              }
          });

          shopCarItemViewHolder.mCheckBox.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {

                  boolean  isChecked= shopCarItemViewHolder.mCheckBox.isChecked();

                    listShop.get(i).setChecked(isChecked);

                    if (listener!=null){

                          listener.changeData(listShop);

                    }
              }
          });
    }

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

    public class ShopCarItemViewHolder extends RecyclerView.ViewHolder {

           ImageView mImage;
             TextView mTitle,mPrice;
             CheckBox mCheckBox;
             ShopCarAddView mShopCarAddView;
        public ShopCarItemViewHolder(@NonNull View itemView) {
            super(itemView);

            mImage=(ImageView) itemView.findViewById(R.id.iv_shop);
            mTitle=(TextView) itemView.findViewById(R.id.tv_title);
            mPrice = (TextView)itemView.findViewById(R.id.tv_price);
            mCheckBox = (CheckBox)itemView.findViewById(R.id.checkbox);

            mShopCarAddView=(ShopCarAddView) itemView.findViewById(R.id.shop_car_view);
        }
    }

         private OnCallBackListener listener;
       public void setOnCallBackListener(OnCallBackListener listener){
           this.listener=listener;
    }
    public interface OnCallBackListener{

           void changeData(List<ShopCarBean.DataBean.ListBean>listShop);
    }
}

网络工具类没有封装,直接写在MainModelmI层中了。。。。。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值