商家Adapter:
public class ShopperAdapter extends RecyclerView.Adapter<ShopperAdapter.ViewHolder> {
private Context context;
private List<CartBean.DataBean> list;
public ShopperAdapter(Context context, List<CartBean.DataBean> list) {
this.context = context;
this.list = list;
}
// 一级列表发生变化的监听
public interface OnShopperClickListener {
void onShopperClick(int position, boolean isChecked);
}
private OnShopperClickListener onShopperClickListener;
public void setOnShopperClickListener(OnShopperClickListener onShopperClickListener) {
this.onShopperClickListener = onShopperClickListener;
}
// 二级列表的加减器监听
public ProductAdapter.OnAddDecreaseProductListener onAddDecreaseProductListener;
public void setOnAddDecreaseProductListener(ProductAdapter.OnAddDecreaseProductListener onAddDecreaseProductListener) {
this.onAddDecreaseProductListener = onAddDecreaseProductListener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_shopper, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
final CartBean.DataBean shopper = list.get(position);
holder.txtShopperName.setText(shopper.getSellerName());
// 产品的列表
List<CartBean.DataBean.ListBean> list = this.list.get(position).getList();
final ProductAdapter productAdapter = new ProductAdapter(context, list);
holder.rvProduct.setLayoutManager(new LinearLayoutManager(context));
// 给二级列表添加一个加减器监听
if (onAddDecreaseProductListener != null) {
productAdapter.setOnAddDecreaseProductListener(onAddDecreaseProductListener);
}
// 二级条目的复选事件
productAdapter.setOnProductClickListener(new ProductAdapter.OnProductClickListener() {
@Override
public void onProductClick(int position, boolean isChecked) {
if (!isChecked) {
shopper.setChecked(false);
if (onShopperClickListener != null) {
onShopperClickListener.onShopperClick(position, false);
}
} else {
boolean isAllProductChecked = true;
for (CartBean.DataBean.ListBean listBean : shopper.getList()) {
if (!listBean.isChecked()) {
isAllProductChecked = false;
break;
}
}
shopper.setChecked(isAllProductChecked);
if (onShopperClickListener != null) {
onShopperClickListener.onShopperClick(position, true);
}
}
notifyDataSetChanged();
onAddDecreaseProductListener.onChange(0, 0);
}
});
holder.rvProduct.setAdapter(productAdapter);
holder.cbShopper.setOnCheckedChangeListener(null);
holder.cbShopper.setChecked(shopper.isChecked());
holder.cbShopper.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
shopper.setChecked(b);
List<CartBean.DataBean.ListBean> productList = shopper.getList();
for (CartBean.DataBean.ListBean listBean : productList) {
listBean.setChecked(b);
}
productAdapter.notifyDataSetChanged();
if (onShopperClickListener != null) {
onShopperClickListener.onShopperClick(position, b);
}
}
});
}
@Override
public int getItemCount() {
return list.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.cb_shopper)
CheckBox cbShopper;
@BindView(R.id.txt_shopper_name)
TextView txtShopperName;
@BindView(R.id.rv_product)
RecyclerView rvProduct;
ViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
}
}
}
商品Adapter:
public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ViewHolder> {
private Context context;
private List<CartBean.DataBean.ListBean> list;
public ProductAdapter(Context context, List<CartBean.DataBean.ListBean> list) {
this.context = context;
this.list = list;
}
// 二级条目发生变化的监听
public interface OnProductClickListener {
void onProductClick(int position, boolean isChecked);
}
private OnProductClickListener onProductClickListener;
public void setOnProductClickListener(OnProductClickListener onProductClickListener) {
this.onProductClickListener = onProductClickListener;
}
// 加减器发生变化的监听
public interface OnAddDecreaseProductListener {
void onChange(int position, int num);
}
private OnAddDecreaseProductListener onAddDecreaseProductListener;
public void setOnAddDecreaseProductListener(OnAddDecreaseProductListener onAddDecreaseProductListener) {
this.onAddDecreaseProductListener = onAddDecreaseProductListener;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_product, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
// 获取商品(product)对象
final CartBean.DataBean.ListBean product = list.get(position);
// 配置显示内容
String[] images = product.getImages().replace("|", ",").replace("https", "http").split(",");
Picasso.with(context).load(images[0]).into(holder.imgLogo);
holder.txtProductName.setText(product.getTitle());
holder.txtProductPrice.setText("¥" + product.getPrice());
holder.madAdv.setNum(product.getNum());
holder.madAdv.setOnAddDecreaseClickListener(new MyAddDecreaseView.OnAddDecreaseClickListener() {
@Override
public void onAddClick(int num) {
product.setNum(num);
if (onAddDecreaseProductListener != null) {
onAddDecreaseProductListener.onChange(position, num);
}
}
@Override
public void onDecreaseClick(int num) {
product.setNum(num);
if (onAddDecreaseProductListener != null) {
onAddDecreaseProductListener.onChange(position, num);
}
}
});
// 商品复选框
holder.cbProduct.setOnCheckedChangeListener(null);
holder.cbProduct.setChecked(product.isChecked());
holder.cbProduct.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
product.setChecked(b);
if (onProductClickListener != null) {
onProductClickListener.onProductClick(position, b);
}
}
});
}
@Override
public int getItemCount() {
return list.size();
}
class ViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.cb_product)
CheckBox cbProduct;
@BindView(R.id.img_logo)
ImageView imgLogo;
@BindView(R.id.txt_product_name)
TextView txtProductName;
@BindView(R.id.txt_product_price)
TextView txtProductPrice;
@BindView(R.id.mad_adv)
MyAddDecreaseView madAdv;
ViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
}
}
}
MainActivity:
public class MainActivity extends BaseActivity<CartPresenter> implements ICartView {
@BindView(R.id.rv_carts)
RecyclerView rvCarts;
@BindView(R.id.cb_check_all)
CheckBox cbCheckAll;
@BindView(R.id.txt_total_price)
TextView txtTotalPrice;
@BindView(R.id.txt_edit)
TextView txtEdit;
private List<CartBean.DataBean> list;
private ShopperAdapter shopperAdapter;
@Override
public Context getContext() {
return this;
}
@Override
public void getCarts(CartBean data) {
list.addAll(data.getData());
shopperAdapter.notifyDataSetChanged();
}
@Override
protected void setListener() {
super.setListener();
cbCheckAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean isChecked = cbCheckAll.isChecked();
for (CartBean.DataBean dataBean : list) {
dataBean.setChecked(isChecked);
List<CartBean.DataBean.ListBean> products = dataBean.getList();
for (CartBean.DataBean.ListBean product : products) {
product.setChecked(isChecked);
}
}
calculatePrice();
shopperAdapter.notifyDataSetChanged();
}
});
}
private void calculatePrice() {
float totalPrice = 0;
for (CartBean.DataBean dataBean : list) {
List<CartBean.DataBean.ListBean> products = dataBean.getList();
for (CartBean.DataBean.ListBean product : products) {
if (product.isChecked()) {
totalPrice += product.getPrice() * product.getNum();
}
}
}
txtTotalPrice.setText("合计:¥" + totalPrice);
}
@Override
public void onCartFailed(Throwable t) {
Toast.makeText(this, t.getMessage(), Toast.LENGTH_SHORT).show();
}
@Override
protected void initData() {
presenter.getCarts();
list = new ArrayList<>();
shopperAdapter = new ShopperAdapter(this, list);
shopperAdapter.setOnShopperClickListener(new ShopperAdapter.OnShopperClickListener() {
@Override
public void onShopperClick(int position, boolean isChecked) {
if (!isChecked) {
cbCheckAll.setChecked(false);
} else {
boolean isAllShopperChecked = true;
for (CartBean.DataBean dataBean : list) {
if (!dataBean.isChecked()) {
isAllShopperChecked = false;
break;
}
}
cbCheckAll.setChecked(isAllShopperChecked);
}
calculatePrice();
}
});
shopperAdapter.setOnAddDecreaseProductListener(new ProductAdapter.OnAddDecreaseProductListener() {
@Override
public void onChange(int position, int num) {
calculatePrice();
}
});
rvCarts.setLayoutManager(new LinearLayoutManager(this));
rvCarts.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
rvCarts.setAdapter(shopperAdapter);
}
@Override
protected CartPresenter providePresenter() {
return new CartPresenter();
}
@Override
protected int provideLayoutId() {
return R.layout.activity_main;
}
@OnClick(R.id.txt_edit)
public void onViewClicked() {
startActivity(new Intent(this, SearchActivity.class));
}
}
加减器:
public class MyAddDecreaseView extends LinearLayout {
@BindView(R.id.btn_decrease)
Button btnDecrease;
@BindView(R.id.et_num)
TextView etNum;
@BindView(R.id.btn_add)
Button btnAdd;
private int num = 1;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
etNum.setText(num + "");
}
public interface OnAddDecreaseClickListener {
void onAddClick(int num);
void onDecreaseClick(int num);
}
private OnAddDecreaseClickListener onAddDecreaseClickListener;
public void setOnAddDecreaseClickListener(OnAddDecreaseClickListener onAddDecreaseClickListener) {
this.onAddDecreaseClickListener = onAddDecreaseClickListener;
}
public MyAddDecreaseView(Context context) {
this(context, null);
}
public MyAddDecreaseView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public MyAddDecreaseView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initData(context);
}
private void initData(Context context) {
View.inflate(context, R.layout.widget_add_decrease, this);
ButterKnife.bind(this);
etNum.setText(num + "");
}
@OnClick({R.id.btn_decrease, R.id.btn_add})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.btn_decrease:
if (num > 1) {
num--;
}
etNum.setText(num + "");
if (onAddDecreaseClickListener != null) {
onAddDecreaseClickListener.onDecreaseClick(num);
}
break;
case R.id.btn_add:
num++;
etNum.setText(num + "");
if (onAddDecreaseClickListener != null) {
onAddDecreaseClickListener.onAddClick(num);
}
break;
}
}
}