购物车,功能完善

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)");
    }

}

}

/**

  • 展示商家的适配器
    */
    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();
    }

    扫描二维码关注公众号,回复: 6393264 查看本文章

    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);
    }
    }

/**

  • 展示商家里的商品
    */
    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();
    }
    }

/**
*自定义加减器

  • 加减数量
    */
    public class CustomCounterView extends RelativeLayout implements View.OnClickListener {
    private TextView mEditCar;
    private Context mContext;

    private List<ShopBean.DataBean.ListBean> mList = new ArrayList<>();
    private int position;
    private ProductsAdapter mProductsAdapter;

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

    public CustomCounterView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context);
    }

    public CustomCounterView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context);
    }

    private void init(Context context) {
    this.mContext = context;
    View view = View.inflate(context, R.layout.shop_car_price_layout, null);
    ImageView addIamge = (ImageView) view.findViewById(R.id.add_car);
    ImageView jianIamge = (ImageView) view.findViewById(R.id.jian_car);
    mEditCar = view.findViewById(R.id.edit_shop_car);
    addIamge.setOnClickListener(this);
    jianIamge.setOnClickListener(this);
    addView(view);

     mEditCar.addTextChangedListener(new TextWatcher() {
         @Override
         public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
         }
    
         @Override
         public void onTextChanged(CharSequence s, int start, int before, int count) {
             num = Integer.parseInt(s.toString());
             //TODO:改变数量
         }
    
         @Override
         public void afterTextChanged(Editable s) {
    
         }
     });
    

    }

    private int num;

    @Override
    public void onClick(View view) {
    switch (view.getId()) {
    case R.id.add_car:
    //改变数量,设置数量,改变对象内容,回调,局部刷新
    num++;
    mEditCar.setText(num + “”);
    mList.get(position).setNum(num);
    mCallBackListener.callBack();
    break;
    case R.id.jian_car:
    if (num > 1) {
    num–;
    } else {
    toast(“我是有底线的啊”);
    }
    mEditCar.setText(num + “”);
    mList.get(position).setNum(num);
    mCallBackListener.callBack();
    break;
    default:
    break;
    }
    }

    private void toast(String msg) {
    Toast.makeText(mContext, msg, Toast.LENGTH_LONG).show();
    }

    public void setData(ProductsAdapter mProductsAdapter, List<ShopBean.DataBean.ListBean> list, int i) {
    this.mList = list;
    this.mProductsAdapter = mProductsAdapter;
    position = i;
    num = list.get(i).getNum();
    mEditCar.setText(num + “”);
    }

    private CallBackListener mCallBackListener;

    public void setOnCallBack(CallBackListener listener) {
    this.mCallBackListener = listener;
    }

    public interface CallBackListener {
    void callBack();
    }
    }

猜你喜欢

转载自blog.csdn.net/black_amber/article/details/90346392