mvp+okhttp+购物车逻辑 实现RecyclerView商家嵌套RecyclerView商品+接口回调

MainActivity进行结算和勾选的算法

package com.bawei.myshopcar.activity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;

import com.bawei.myshopcar.Apis;
import com.bawei.myshopcar.Bean.ShopBean;
import com.bawei.myshopcar.Bean.ShopTypeBean;
import com.bawei.myshopcar.Constants;
import com.bawei.myshopcar.R;
import com.bawei.myshopcar.adapter.ShopAdapter;
import com.bawei.myshopcar.adapter.ShopTypeAdapter;
import com.bawei.myshopcar.presenter.IPresenterImpl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ShopCarActivity extends AppCompatActivity implements IView, View.OnClickListener {
private ShopAdapter mShopAdapter;
private CheckBox mIvCircle;
private List<ShopBean.DataBean> mList = new ArrayList<>();
private TextView mAllPriceTxt, nSumPrice;
private IPresenterImpl mIPresenterImpl;
private RecyclerView mRecyclerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_product_list);

    mIPresenterImpl = new IPresenterImpl(this);
    initView();
    getData();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mIPresenterImpl.onDetach();
}

private void initView() {
    mIvCircle = (CheckBox) findViewById(R.id.iv_cricle);
    mAllPriceTxt = (TextView) findViewById(R.id.all_price);
    nSumPrice = (TextView) findViewById(R.id.sum_price_txt);
    mIvCircle.setOnClickListener(this);

    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    mRecyclerView.setLayoutManager(linearLayoutManager);
    mShopAdapter = new ShopAdapter(this);
    mRecyclerView.setAdapter(mShopAdapter);

    mShopAdapter.setListener(new ShopAdapter.ShopCallBackListener() {
        @Override
        public void callBack(List<ShopBean.DataBean> list) {
            //在这里重新遍历已经改状态后的数据,
            // 这里不能break跳出,因为还需要计算后面点击商品的价格和数目,所以必须跑完整个循环
            double totalPrice = 0;

            //勾选商品的数量,不是该商品购买的数量
            int num = 0;
            //所有商品总数,和上面的数量做比对,如果两者相等,则说明全选
            int totalNum = 0;
            for (int a = 0; a < list.size(); a++) {
                //获取商家里商品
                List<ShopBean.DataBean.ListBean> listAll = list.get(a).getList();
                for (int i = 0; i < listAll.size(); i++) {
                    totalNum = totalNum + listAll.get(i).getNum();
                    //取选中的状态
                    if (listAll.get(i).isCheck()) {
                        totalPrice = totalPrice + (listAll.get(i).getPrice() * listAll.get(i).getNum());
                        num = num + listAll.get(i).getNum();
                    }
                }
            }

            if (num < totalNum) {
                //不是全部选中
                mIvCircle.setChecked(false);
            } else {
                //是全部选中
                mIvCircle.setChecked(true);
            }

            mAllPriceTxt.setText("合计:" + totalPrice);
            nSumPrice.setText("去结算(" + num + ")");
        }
    });
}

private void getData() {
    Map<String, String> map = new HashMap<>();
    map.put(Constants.MAP_KEY_GET_PRODUCT_UID, "71");
    mIPresenterImpl.startRequest(Apis.URL_GET_SHOP_CAR_INFO, map, ShopBean.class);
}

@Override
public void showResponseData(Object data) {
    if (data instanceof ShopBean) {
        ShopBean shopBean = (ShopBean) data;
        mList = shopBean.getData();
        if (mList != null) {
            mList.remove(0);
            mShopAdapter.setList(mList);
        }
    }
}

@Override
public void showResponseFail(Object data) {

}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.iv_cricle:
            checkSeller(mIvCircle.isChecked());
            mShopAdapter.notifyDataSetChanged();
            break;
        default:

    }
}

/**
 * 修改选中状态,获取价格和数量
 */
private void checkSeller(boolean bool) {
    double totalPrice = 0;
    int num = 0;
    for (int a = 0; a < mList.size(); a++) {
        //遍历商家,改变状态
        ShopBean.DataBean dataBean = mList.get(a);
        dataBean.setCheck(bool);

        List<ShopBean.DataBean.ListBean> listAll = mList.get(a).getList();
        for (int i = 0; i < listAll.size(); i++) {
            //遍历商品,改变状态
            listAll.get(i).setCheck(bool);
            totalPrice = totalPrice + (listAll.get(i).getPrice() * listAll.get(i).getNum());
            num = num + listAll.get(i).getNum();
        }
    }

    if (bool) {
        mAllPriceTxt.setText("合计:" + totalPrice);
        nSumPrice.setText("去结算(" + num + ")");
    } else {
        mAllPriceTxt.setText("合计:0.00");
        nSumPrice.setText("去结算(0)");
    }

}

}

商家适配器 帮顶视图的时候嵌套商品的RecyclerView

package com.bawei.myshopcar.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.bawei.myshopcar.Bean.ShopBean;
import com.bawei.myshopcar.R;

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

/**

  • 展示商家的适配器
    */
    public class ShopAdapter extends RecyclerView.Adapter<ShopAdapter.MyViewHolder> {
    private List<ShopBean.DataBean> mList = new ArrayList<>();
    private Context mContext;

    public ShopAdapter(Context context) {
    this.mContext = context;
    }

    @NonNull
    @Override
    public ShopAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = View.inflate(mContext, R.layout.shop_seller_car_adapter, null);
    MyViewHolder myViewHoler = new MyViewHolder(view);
    return myViewHoler;
    }

    @Override
    public void onBindViewHolder(@NonNull final ShopAdapter.MyViewHolder myViewHolder, final int i) {
    //设置商家的名字
    myViewHolder.mSellerName.setText(mList.get(i).getSellerName());
    final ProductsAdapter productsAdapter = new ProductsAdapter(mContext, mList.get(i).getList());
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext);
    myViewHolder.mRecyclerView.setLayoutManager(linearLayoutManager);
    myViewHolder.mRecyclerView.setAdapter(productsAdapter);

     myViewHolder.mCheck.setChecked(mList.get(i).isCheck());
    
     productsAdapter.setListener(new ProductsAdapter.ShopCallBackListener() {
         @Override
         public void callBack() {
             //从商品适配里回调回来,回给activity,activity计算价格和数量
             if(mShopCallBackListener != null) {
                 mShopCallBackListener.callBack(mList);
             }
    
             List<ShopBean.DataBean.ListBean> listBeans = mList.get(i).getList();
             //创建一个临时的标志位,用来记录现在点击的状态
             boolean isAllChecked = true;
             for (ShopBean.DataBean.ListBean bean : listBeans) {
                 if (!bean.isCheck()) {
                     //只要有一个商品未选中,标志位设置成false,并且跳出循环
                     isAllChecked = false;
                     break;
                 }
             }
    
             //刷新商家的状态
             myViewHolder.mCheck.setChecked(isAllChecked);
             mList.get(i).setCheck(isAllChecked);
         }
     });
    
     //监听checkBox的点击事件
     //目的是改变旗下所有商品的选中状态
     myViewHolder.mCheck.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             //首先改变自己的标志位
             mList.get(i).setCheck(myViewHolder.mCheck.isChecked());
             //调用产品adapter的方法,用来全选和反选
             productsAdapter.selectOrRemoveAll(myViewHolder.mCheck.isChecked());
         }
     });
    

    }

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

    public void setList(List<ShopBean.DataBean> list) {
    this.mList = list;
    notifyDataSetChanged();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {
    RecyclerView mRecyclerView;
    TextView mSellerName;
    CheckBox mCheck;

     public MyViewHolder(@NonNull View itemView) {
         super(itemView);
         mSellerName = (TextView) itemView.findViewById(R.id.tv_shop);
         mCheck = itemView.findViewById(R.id.check_shop);
         mRecyclerView = (RecyclerView) itemView.findViewById(R.id.recycler_shop);
     }
    

    }

    private ShopCallBackListener mShopCallBackListener;

    public void setListener(ShopCallBackListener listener) {
    this.mShopCallBackListener = listener;
    }

    public interface ShopCallBackListener {
    void callBack(List<ShopBean.DataBean> list);
    }
    }

商品适配器

package com.bawei.myshopcar.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.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;

import com.bawei.myshopcar.Bean.ShopBean;
import com.bawei.myshopcar.R;
import com.bawei.myshopcar.view.CustomCounterView;
import com.bumptech.glide.Glide;

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

/**

  • 展示商家里的商品
    */
    public class ProductsAdapter extends RecyclerView.Adapter<ProductsAdapter.MyViewHolder> {
    private Context mContext;
    private List<ShopBean.DataBean.ListBean> mList = new ArrayList<>();

    public ProductsAdapter(Context context, List<ShopBean.DataBean.ListBean> list) {
    this.mContext = context;
    this.mList = list;
    }

    @NonNull
    @Override
    public ProductsAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = View.inflate(mContext, R.layout.shop_car_adapter, null);
    MyViewHolder myViewHolder = new MyViewHolder(view);
    return myViewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ProductsAdapter.MyViewHolder myViewHolder, final int i) {
    String url = mList.get(i).getImages().split("\|")[0].replace(“https”, “http”);
    Glide.with(mContext).load(url).into(myViewHolder.mImage);

     myViewHolder.mTitle.setText(mList.get(i).getTitle());
     myViewHolder.mPrice.setText(mList.get(i).getPrice() + "");
    
     //根据我记录的状态,改变勾选
     myViewHolder.mCheckBox.setChecked(mList.get(i).isCheck());
    
     //商品的跟商家的有所不同,商品添加了选中改变的监听
     myViewHolder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
         @Override
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
             //优先改变自己的状态
             mList.get(i).setCheck(isChecked);
             //回调,目的是告诉activity,有人选中状态被改变
             if (mShopCallBackListener != null) {
                 mShopCallBackListener.callBack();
             }
         }
     });
    
     //设置自定义View里的Edit
     myViewHolder.mCustomShopCarPrice.setData(this, mList, i);
     myViewHolder.mCustomShopCarPrice.setOnCallBack(new CustomCounterView.CallBackListener() {
         @Override
         public void callBack() {
             if (mShopCallBackListener != null) {
                 mShopCallBackListener.callBack();
             }
         }
     });
    

    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {
    CustomCounterView mCustomShopCarPrice;
    TextView mTitle, mPrice;
    ImageView mImage;
    CheckBox mCheckBox;

     public MyViewHolder(@NonNull View itemView) {
         super(itemView);
         mImage = (ImageView) itemView.findViewById(R.id.iv_product);
         mTitle = (TextView) itemView.findViewById(R.id.tv_product_title);
         mPrice = (TextView) itemView.findViewById(R.id.tv_product_price);
         mCheckBox = (CheckBox) itemView.findViewById(R.id.check_product);
         mCustomShopCarPrice = (CustomCounterView) itemView.findViewById(R.id.custom_product_counter);
     }
    

    }

    /**

    • 在我们子商品的adapter中,修改子商品的全选和反选

    • @param isSelectAll
      */
      public void selectOrRemoveAll(boolean isSelectAll) {
      for (ShopBean.DataBean.ListBean listBean : mList) {
      listBean.setCheck(isSelectAll);
      }

      notifyDataSetChanged();
      }

    private ShopCallBackListener mShopCallBackListener;

    public void setListener(ShopCallBackListener listener) {
    this.mShopCallBackListener = listener;
    }

    public interface ShopCallBackListener {
    void callBack();
    }
    }

猜你喜欢

转载自blog.csdn.net/qq_42960779/article/details/85113341