购物车:
一般情况下分为两种,一种是二级购物车(商家下包括商品),另一种是商城代表商家,购物车只有商品,我这里就是第二种,我只是简单的介绍了购物车页面的各种复选框和价格的逻辑处理,直接上代码,注释清晰。
准备工作:在你商品的bean对象里加一个boolean类型的变量即可;
Activity或fragment:
public class ShopCarFragment extends BaseFragment<ShopCatPresenter> implements ShopCarView {
@BindView(R.id.rlv_shop)
RecyclerView rlv_Shop;
@BindView(R.id.shop_box_all)
CheckBox shopBoxAll;
@BindView(R.id.shop_text_allprice)
TextView shopTextAllprice;
@BindView(R.id.shop_text_go)
TextView shopTextGo;
private SharedPreferences sp_login;
private String userId;
private String sessionId;
private ShopCarAdapter adapter;
private List<QueryCartBean.ResultBean> result;
@Override
public int getFragmentLayout() {
return R.layout.fragment_shopcar;
}
@Override
public void initView() {
sp_login = getActivity().getSharedPreferences("login", Context.MODE_PRIVATE);
sessionId = sp_login.getString("sessionId", null);
userId = sp_login.getString("userId", null);
rlv_Shop.setLayoutManager(new LinearLayoutManager(getActivity()));
rlv_Shop.addItemDecoration(new DividerItemDecoration(getActivity(), OrientationHelper.VERTICAL));
}
@Override
protected ShopCatPresenter getPresenter() {
//实例p
presenter = new ShopCatPresenter(this);
return presenter;
}
@Override
public void initData() {
if (!TextUtils.isEmpty(sessionId) && !TextUtils.isEmpty(userId)) {
//关联p
presenter.onRelated(userId, sessionId);
}
/**
* 全选点击事件
*/
shopBoxAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkAll(shopBoxAll.isChecked());
adapter.notifyDataSetChanged();
}
});
}
@Override
public void getShopCarData(QueryCartBean queryCartBean) {
if (queryCartBean != null) {
result = queryCartBean.getResult();
adapter = new ShopCarAdapter(getActivity(), result);
rlv_Shop.setAdapter(adapter);
adapter.notifyDataSetChanged();
/**
* 商品数量改变,条目复选框点击 --> 回调监听
*/
adapter.setCallbackListener(new ShopCarAdapter.onCallbackListener() {
@Override
public void callback(List<QueryCartBean.ResultBean> list) {
double priceAll = 0;
int num = 0;
int totalNum = 0;
//遍历集合根据状态改变总价格总数量
for (int i = 0; i < list.size(); i++) {
boolean ischeck = list.get(i).isIscheck();
Log.i("xxx", "callback: "+ischeck);
//存入所有商品数量
totalNum+= list.get(i).getCount();
//选中状态
if (ischeck) {
//存入当前商品(价钱*数量)
priceAll += (list.get(i).getPrice() * list.get(i).getCount());
//存入当前商品数量
num += list.get(i).getCount();
}
}
if (num==totalNum){
shopBoxAll.setChecked(true);
}else{
shopBoxAll.setChecked(false);
}
shopTextAllprice.setText("" + priceAll);
shopTextGo.setText("去结算(" + num + ")");
}
});
}
}
/**
* 全选方法
*
* @param checked
*/
private void checkAll(boolean checked) {
double priceAll = 0.0;
int num = 0;
for (int i = 0; i < result.size(); i++) {
//修改商品的复选框
result.get(i).setIscheck(checked);
priceAll = priceAll + (result.get(i).getPrice() * result.get(i).getCount());
num = num + result.get(i).getCount();
}
if (checked) {
shopTextAllprice.setText("合计:" + priceAll);
shopTextGo.setText("去结算(" + num + ")");
} else {
shopTextAllprice.setText("合计:" + 0.0);
shopTextGo.setText("去结算(" + 0 + ")");
}
}
}
适配器:
public class ShopCarAdapter extends RecyclerView.Adapter<ShopCarAdapter.MyViewHolder> {
private Context context;
private List<QueryCartBean.ResultBean> list;
public ShopCarAdapter(Context context, List<QueryCartBean.ResultBean> list) {
this.context = context;
this.list = list;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(context).inflate(R.layout.item_shopcar, null, false);
MyViewHolder myViewHolder = new MyViewHolder(view);
return myViewHolder;
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, final int i) {
QueryCartBean.ResultBean resultBean = list.get(i);
final int price = resultBean.getPrice();
myViewHolder.title_item.setText(resultBean.getCommodityName());
myViewHolder.price_item.setText("¥:" + price);
myViewHolder.img_item.setImageURI(Uri.parse(list.get(i).getPic()));
//根据我记录的状态,改变勾选
myViewHolder.check_item.setChecked(list.get(i).isIscheck());
//商品复选框点击
myViewHolder.check_item.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//修改集合内的状态
list.get(i).setIscheck(isChecked);
if (callbackListener != null) {
callbackListener.callback(list);
}
}
});
//加减器方法
myViewHolder.group_item.setData(this, list, i);
//商品数量改变
myViewHolder.group_item.setNumChangeListener(new GroupLayout.onNumChangeListener() {
@Override
public void changeNum() {
if (callbackListener != null) {
callbackListener.callback(list);
}
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private final CheckBox check_item;
private final SimpleDraweeView img_item;
private final TextView title_item;
private final TextView price_item;
private GroupLayout group_item;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
check_item = itemView.findViewById(R.id.check_item);
img_item = itemView.findViewById(R.id.img_item);
title_item = itemView.findViewById(R.id.title_item);
price_item = itemView.findViewById(R.id.price_item);
group_item = itemView.findViewById(R.id.group_item);
}
}
/**
* 计算总价接口回调
*/
public interface onCallbackListener {
void callback(List<QueryCartBean.ResultBean> list);
}
public onCallbackListener callbackListener;
public void setCallbackListener(onCallbackListener callbackListener) {
this.callbackListener = callbackListener;
}
}
自定义组合控件(加减):
public class GroupLayout extends LinearLayout implements View.OnClickListener {
private int number = 1;
private EditText num_goods;
private ShopCarAdapter shopCarAdapter;
private List<QueryCartBean.ResultBean> list;
private int i;
public GroupLayout(Context context) {
super(context);
}
public GroupLayout(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.group_layout, this);
//控件
TextView minus_goods = findViewById(R.id.minus_goods);
TextView add_goods = findViewById(R.id.add_goods);
num_goods = findViewById(R.id.num_goods);
num_goods.setText(number + "");
/**
* 设置点击事件监听
*/
minus_goods.setOnClickListener(this);
add_goods.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.add_goods://加
number++;
num_goods.setText(number + "");
list.get(i).setCount(number);
numChangeListener.changeNum();
shopCarAdapter.notifyItemChanged(i);
break;
case R.id.minus_goods://减
if (number > 1) {
number--;
} else {
Toast.makeText(getContext(), "不能再少了", Toast.LENGTH_SHORT).show();
}
num_goods.setText(number + "");
list.get(i).setCount(number);
numChangeListener.changeNum();
shopCarAdapter.notifyItemChanged(i);
break;
}
}
public void setData(ShopCarAdapter shopCarAdapter, List<QueryCartBean.ResultBean> list, int i) {
this.list = list;
this.shopCarAdapter = shopCarAdapter;
this.i = i;
number = list.get(i).getCount();
num_goods.setText(this.number + "");
}
public interface onNumChangeListener {
void changeNum();
}
public onNumChangeListener numChangeListener;
public void setNumChangeListener(onNumChangeListener numChangeListener) {
this.numChangeListener = numChangeListener;
}
}