自定义加减器;;;; private int num; public void setNum(int num) { this.num = num; tvNum.setText(num + ""); } public int getNum() { return num; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.tv_add: num++; tvNum.setText(num+""); if(listener != null){ listener.add(num); } break; case R.id.tv_decrease: if(num > 1){ num--; } tvNum.setText(num+""); if(listener != null){ listener.decrease(num); } break; } } public interface onAddDecreaseListener { void add(int num); void decrease(int num); } private onAddDecreaseListener listener; public void setonAddDecreaseListener(onAddDecreaseListener listener) { this.listener = listener; }
一级列表 布局;;;
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="75dp" android:gravity="center" android:paddingLeft="20dp" android:orientation="horizontal"> <CheckBox android:id="@+id/cb_product" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:id="@+id/iv_product" android:layout_width="45dp" android:layout_height="45dp" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <soexample.umeng.com.cartdemo.AddDecrease android:id="@+id/view_add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5dp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true"></soexample.umeng.com.cartdemo.AddDecrease> <TextView android:id="@+id/tv_product_name" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_product_price" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/view_add" android:layout_alignParentLeft="true" android:layout_alignParentBottom="true"/> </RelativeLayout> </LinearLayout>
二级列表布局;;;;
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal"> <CheckBox android:id="@+id/cb_shopper" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tv_shopper" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> <android.support.v7.widget.RecyclerView android:id="@+id/rv_product" android:layout_width="match_parent" android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView> </LinearLayout>
二级列表 适配器;;;;
package soexample.umeng.com.cartdemo.adapter; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; 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.bumptech.glide.Glide; import java.util.List; import soexample.umeng.com.cartdemo.AddDecrease; import soexample.umeng.com.cartdemo.R; import soexample.umeng.com.cartdemo.entity.ListBean; import soexample.umeng.com.cartdemo.utils.StrinUtils; /** * Created by TP-PC on 2018.10.23. */ public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ViewHolder> { private Context context; private List<ListBean> list; public ProductAdapter(Context context, List<ListBean> list) { this.context = context; this.list = list; } //创建视图 @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View inflate = View.inflate(context, R.layout.item_product, null); ViewHolder holder = new ViewHolder(inflate); return holder; } //绑定视图 @Override public void onBindViewHolder(@NonNull ViewHolder holder, final int position) { final ListBean listBean = list.get(position); //设置图片 String images = listBean.getImages(); if (!TextUtils.isEmpty(images)) { String[] split = images.split("\\|"); if (split.length > 0) { Glide.with(context).load(StrinUtils.stringHttp(split[0])) .into(holder.ivProduct); } } //设置条目数据 holder.tvProduct.setText(listBean.getTitle()); holder.tvprice.setText(listBean.getPrice() + ""); holder.adv.setNum(listBean.getNum()); //加减器点击事件 holder.adv.setonAddDecreaseListener(new AddDecrease.onAddDecreaseListener() { @Override public void add(int num) { listBean.setNum(num); if (listener != null) { listener.onChange(position, num); } } @Override public void decrease(int num) { listBean.setNum(num); if (listener != null) { listener.onChange(position, num); } } }); holder.cbProduct.setOnCheckedChangeListener(null); holder.cbProduct.setChecked(listBean.isChecked()); holder.cbProduct.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { listBean.setChecked(isChecked); if (productClickListener != null) { productClickListener.onProductClick(position, isChecked); } } }); } // 条目数量 @Override public int getItemCount() { return list.size(); } // 自定义ViewHolder class ViewHolder extends RecyclerView.ViewHolder { private CheckBox cbProduct; private ImageView ivProduct; private TextView tvProduct, tvprice; private AddDecrease adv; public ViewHolder(View itemView) { super(itemView); cbProduct = itemView.findViewById(R.id.cb_product); ivProduct = itemView.findViewById(R.id.iv_product); tvProduct = itemView.findViewById(R.id.tv_product_name); tvprice = itemView.findViewById(R.id.tv_product_price); adv = itemView.findViewById(R.id.view_add); } } // 加减器 点击事件 public interface onAddDecreaseListener { void onChange(int position, int num); } private onAddDecreaseListener listener; public void setonAddDecreaseListener(onAddDecreaseListener listener) { this.listener = listener; } // 二级条目 点击事件 public interface onProductClickListener { void onProductClick(int position, boolean isChecked); } private onProductClickListener productClickListener; public void setonProductListener(onProductClickListener listener) { this.productClickListener = listener; } }
一级列表适配器;;;;;
package soexample.umeng.com.cartdemo.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.CompoundButton; import android.widget.TextView; import java.util.List; import soexample.umeng.com.cartdemo.R; import soexample.umeng.com.cartdemo.entity.DataBean; import soexample.umeng.com.cartdemo.entity.ListBean; /** * Created by TP-PC on 2018.10.23. */ public class ShopAdapter extends RecyclerView.Adapter<ShopAdapter.ViewHolder> { private Context context; private List<DataBean<List<ListBean>>> list; public ShopAdapter(Context context, List<DataBean<List<ListBean>>> list) { this.context = context; this.list = list; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View v = View.inflate(context,R.layout.item_shop,null); ViewHolder holder = new ViewHolder(v); return holder; } @Override public void onBindViewHolder(@NonNull ViewHolder holder, final int position) { final DataBean<List<ListBean>> listDataBean = list.get(position); holder.tvShopName.setText(listDataBean.getSellerName()); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context); holder.rvProduct.setLayoutManager(linearLayoutManager); final ProductAdapter productAdapter = new ProductAdapter(context, listDataBean.getList()); // 给二级列表添加一个加减器的监听 if(productListener != null){ productAdapter.setonAddDecreaseListener(productListener); } // 二级条目(商品)复选框点击事件 productAdapter.setonProductListener(new ProductAdapter.onProductClickListener() { @Override public void onProductClick(int position, boolean isChecked) { // 当前商品未选中,商家也就未选中 if(!isChecked){ listDataBean.setChecked(false); // 只要是当前条目未选中,全选复选框也就没选中 shopClickListener.onShopClick(position,false); } else { // 当前商品如果选中,需要遍历商家所有的商品是否选中 // 循环遍历之前先设置一个true标志位,只要有一条商品没有被选中,商家也就选中 boolean isAllSelected = true; for (ListBean listBean : listDataBean.getList()) { if(!listBean.isChecked()){ isAllSelected = false; break; } } listDataBean.setChecked(isAllSelected); shopClickListener.onShopClick(position,true); } notifyDataSetChanged(); productListener.onChange(0,0); } }); holder.rvProduct.setAdapter(productAdapter); // 先取消掉之前的点击变化监听 holder.cbCheck.setOnCheckedChangeListener(null); // 设置好初始化的状态 holder.cbCheck.setChecked(listDataBean.isChecked()); // 等设置完初始化状态之后再设置我们自己的监听 // 商家列表中的复选框 holder.cbCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { listDataBean.setChecked(isChecked); List<ListBean> list = listDataBean.getList(); for (ListBean listBean : list) { listBean.setChecked(isChecked); } productAdapter.notifyDataSetChanged(); if(shopClickListener != null){ shopClickListener.onShopClick(position,isChecked); } } }); } @Override public int getItemCount() { return list.size(); } class ViewHolder extends RecyclerView.ViewHolder{ private CheckBox cbCheck; private TextView tvShopName; private RecyclerView rvProduct; public ViewHolder(View itemView) { super(itemView); cbCheck = itemView.findViewById(R.id.cb_shopper); tvShopName = itemView.findViewById(R.id.tv_shopper); rvProduct = itemView.findViewById(R.id.rv_product); } } // 一级列表(商家)发生变化的接口 public interface onShopClickListener{ void onShopClick(int position,boolean isCheck); } private onShopClickListener shopClickListener; public void setonShopClickListener(onShopClickListener shopClickListener){ this.shopClickListener = shopClickListener; } // 二级列表的加减器监听 private ProductAdapter.onAddDecreaseListener productListener; public void setOnAddDecreaseListener(ProductAdapter.onAddDecreaseListener listener){ this.productListener = listener; } }
购物车页面;;;
package soexample.umeng.com.cartdemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import soexample.umeng.com.cartdemo.adapter.ProductAdapter; import soexample.umeng.com.cartdemo.adapter.ShopAdapter; import soexample.umeng.com.cartdemo.entity.DataBean; import soexample.umeng.com.cartdemo.entity.ListBean; import soexample.umeng.com.cartdemo.entity.MessageBean; import soexample.umeng.com.cartdemo.mvp.presenter.CartPresenter; import soexample.umeng.com.cartdemo.mvp.view.IView; public class MainActivity extends AppCompatActivity implements IView { private RecyclerView rvShop; private CheckBox cbTotal; private TextView tvTotal; private Button btnPay; private ShopAdapter adapter; private CartPresenter presenter; private List<DataBean<List<ListBean>>> lists; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); cbTotal.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { boolean isChecked = cbTotal.isChecked(); for (DataBean<List<ListBean>> list : lists) { list.setChecked(isChecked); List<ListBean> list1 = list.getList(); for (ListBean listBean : list1) { listBean.setChecked(isChecked); } } adapter.notifyDataSetChanged(); } }); } private void initData() { lists = new ArrayList<>(); adapter = new ShopAdapter(this, lists); adapter.setonShopClickListener(new ShopAdapter.onShopClickListener() { @Override public void onShopClick(int position, boolean isCheck) { if (!isCheck) { cbTotal.setChecked(false); } else { boolean isAll = true; for (DataBean<List<ListBean>> list : lists) { if (!list.isChecked()) { isAll = false; break; } } cbTotal.setChecked(isAll); } calculatePrice(); } }); adapter.setOnAddDecreaseListener(new ProductAdapter.onAddDecreaseListener() { @Override public void onChange(int position, int num) { calculatePrice(); } }); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); rvShop.setLayoutManager(linearLayoutManager); rvShop.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); rvShop.setAdapter(adapter); presenter = new CartPresenter(); presenter.attach(this); presenter.getData(); } private void calculatePrice() { float totalPrice = 0; for (DataBean<List<ListBean>> list : lists) { List<ListBean> list1 = list.getList(); for (ListBean listBean : list1) { if (listBean.isChecked()) { totalPrice += listBean.getNum() * listBean.getPrice(); } } } tvTotal.setText(totalPrice + ""); } private void initView() { rvShop = findViewById(R.id.rv_shop); cbTotal = findViewById(R.id.cb_total_select); tvTotal = findViewById(R.id.tv_total_price); btnPay = findViewById(R.id.btn_pay); } @Override public void success(MessageBean<List<DataBean<List<ListBean>>>> list) { if (list != null) { List<DataBean<List<ListBean>>> data = list.getData(); if (data != null) { lists.clear(); lists.addAll(data); adapter.notifyDataSetChanged(); } } } @Override public void failed(Exception e) { } }