仿京东购物车Deom
写代码前要先加上权限和依赖:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" />依赖:
compile 'com.android.support:design:26.+' //tablayout依赖 compile 'com.google.code.gson:gson:2.8.2' compile 'com.github.bumptech.glide:glide:3.6.0' compile 'com.squareup.okhttp3:okhttp:3.6.0' compile 'com.squareup.okio:okio:1.11.0' compile 'com.android.support:recyclerview-v7:26.+'因为购物车的逻辑性很强,所以写购物车之前要想清楚要写哪一步,不然很容易蒙圈...
各种需要的工具类中的东西
封装的OkHttp(我是用的OkHttp3请求数据);
因为是封装的,在这里就不多说了,见接口:
一些可能用到的接口:
//加入购物车 public static final String ADDCART_API = "https://www.zhaoapi.cn/product/addCart?uid=2845"; //购物车 public static final String SELECTART_API = "https://www.zhaoapi.cn/product/getCarts?uid=2845"; //更新购物车 public static final String UpDateCart_API = "https://www.zhaoapi.cn/product/updateCarts"; //删除购物车 public static final String DELETECART_API = "https://www.zhaoapi.cn/product/deleteCart";用MVP的模式写,很清晰也很快;
MVP模式:
到了model层就不要忘了bean包,有些bean包可能要自己手动加入一些东西;
这个在购物车的bean包会让自己手动加入全选的判断(因为我用的接口没有)
public static class DataBean { //自己写几个方法(3个) private boolean allChildInGroupCheck; public boolean isGroupCheck() { return allChildInGroupCheck; } public void setGroupCheck(boolean allChildInGroupCheck) { this.allChildInGroupCheck = allChildInGroupCheck; } /** * list : [{"bargainPrice":399,"createtime":"2017-10-02T15:20:02","detailUrl":"https://item.m.jd.com/product/1439822107.html?utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=QQfriends","images":"https://m.360buyimg.com/n0/jfs/t5887/201/859509257/69994/6bde9bf6/59224c24Ne854e14c.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5641/233/853609022/57374/5c73d281/59224c24N3324d5f4.jpg!q70.jpg|https://m.360buyimg.com/n0/jfs/t5641/233/853609022/57374/5c73d281/59224c24N3324d5f4.jpg!q70.jpg","num":2,"pid":81,"price":699,"pscid":85,"selected":0,"sellerid":2,"subhead":"满2件,总价打6.50折","title":"Gap男装 休闲舒适简约水洗五袋直筒长裤紧身牛仔裤941825 深灰色 33/32(175/84A)"}] * sellerName : 商家2 * sellerid : 2 */CountPriceBean,这个bean包是计算价钱的包;
public class CountPriceBean { private String priceString; private int count; public CountPriceBean(String priceString, int count) { this.priceString = priceString; this.count = count; } public String getPriceString() { return priceString; } public void setPriceString(String priceString) { this.priceString = priceString; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } }
Model层:
public class CarModel { private final ICartPre iCartPre; public CarModel(ICartPre iCartPre){ this.iCartPre = iCartPre; } public void getData(String url){ OkHttp3Util.doGet(url, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()){ String string = response.body().string(); CartBean cartBean = new Gson().fromJson(string, CartBean.class); iCartPre.onSuccess(cartBean); } } }); } }Presenter层:
//p层的一个接口:
public interface ICartPre { void onSuccess(CartBean cartBean); }//p层接口的实现类:
public class CartPresenter implements ICartPre { private CarModel carModel; private ICartView iCartView; public CartPresenter(ICartView iCartView){ this.iCartView = iCartView; carModel = new CarModel(this); } public void getData(String url){ carModel.getData(url); } @Override public void onSuccess(CartBean cartBean) { iCartView.onSuccess(cartBean); } }//View层:
//view层接口:
public interface ICartView { void onSuccess(CartBean cartBean); }//view层接口的实现类就是Activity或fragment:
//实现接口先不着急,先完成主页面的布局:
要注意,购物车的列表是二级列表,所以自定义一个二级列表:
/** * Created by Administrator * 购物车的二级列表 */ public class CartTwoListView extends ExpandableListView { public CartTwoListView(Context context) { super(context); } public CartTwoListView(Context context, AttributeSet attrs) { super(context, attrs); } public CartTwoListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } //重写测量的方法 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int height = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, height); } }
购物车的主布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="CartActivity"> <RelativeLayout android:id="@+id/rl1" android:layout_width="match_parent" android:layout_height="50dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="购物车" android:textSize="26sp" /> </RelativeLayout> <ScrollView android:id="@+id/sl1" android:layout_below="@+id/rl1" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!--二级购物车列表--> <wwx.util.CartTwoListView android:id="@+id/cartTwoListView" android:layout_width="match_parent" android:layout_height="wrap_content"> </wwx.util.CartTwoListView> <!--为你推荐--> <TextView android:layout_width="match_parent" android:layout_height="300dp" android:text="为你推荐" android:background="#0f0"/> </LinearLayout> </ScrollView> <RelativeLayout android:id="@+id/progressBar" android:visibility="gone" android:layout_centerInParent="true" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> <LinearLayout android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="50dp" android:background="#fff" android:orientation="horizontal"> <CheckBox android:id="@+id/check_all" android:layout_width="40dp" android:gravity="center" android:layout_height="40dp" /> <TextView android:id="@+id/text_total" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="合计:¥0.00"/> <TextView android:id="@+id/text_buy" android:layout_width="0dp" android:layout_weight="1" android:textColor="#fff" android:layout_height="match_parent" android:gravity="center" android:background="#f00" android:layout_marginLeft="10dp" android:text="去计算(0)"/> </LinearLayout> </RelativeLayout>
购物车的主页面:
/** * 仿京东购物车 */ public class CartActivity extends AppCompatActivity implements ICartView, View.OnClickListener { private CartTwoListView cartTwoListView; private CheckBox check_all; private TextView text_total; private TextView text_buy; private CartPresenter cartPresenter; private RelativeLayout progressBar; private CartAdapter adapter; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0) { CountPriceBean countPriceBean = (CountPriceBean) msg.obj; Log.i("hand", countPriceBean.getPriceString()); //设置价格和数量 text_total.setText("合计:¥" + countPriceBean.getPriceString()); text_buy.setText("去结算(" + countPriceBean.getCount() + ")"); } } }; private CartBean cartBean; private String priceString; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_cart); findView(); } private void findView() { cartTwoListView = findViewById(R.id.cartTwoListView); progressBar = findViewById(R.id.progressBar); check_all = findViewById(R.id.check_all); text_total = findViewById(R.id.text_total); text_buy = findViewById(R.id.text_buy); } @Override protected void onResume() { super.onResume(); cartPresenter = new CartPresenter(this); cartPresenter.getData(Api.SELECTART_API); //去掉二级列表默认的显示器 cartTwoListView.setGroupIndicator(null); //刚进入页面时让progressBar显示 progressBar.setVisibility(View.VISIBLE); //全选按钮的设置 check_all.setOnClickListener(this); //点击去结算 如果不跳转到订单这里的点击操作不用做 text_buy.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //进入订单页面前先创建订单 //先判断价钱是否相同再跳转(这里和适配器里的计算价钱的数据一样) double price = 0; for (int i = 0; i < cartBean.getData().size(); i++) { List<CartBean.DataBean.ListBean> listBeans = cartBean.getData().get(i).getList(); for (int j = 0; j < listBeans.size(); j++) { if (listBeans.get(j).getSelected() == 1) { price += listBeans.get(j).getBargainPrice() * listBeans.get(j).getNum(); } } } //double高精度,,,计算的时候可能会出现一串数字...保留两位 DecimalFormat decimalFormat = new DecimalFormat("0.00"); priceString = decimalFormat.format(price); tiaoDingDan(); } }); } private void tiaoDingDan() { Map<String, String> map = new HashMap<>(); map.put("uid", "2845"); map.put("price", priceString); OkHttp3Util.doPost(Api.CHUANGJIAN_API, map, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, final Response response) throws IOException { if (response.isSuccessful()) { final String string = response.body().string(); runOnUiThread(new Runnable() { @Override public void run() { CreateDingBean createDingBean = new Gson().fromJson(string, CreateDingBean.class); if (createDingBean.getCode().equals("0")) { Toast.makeText(CartActivity.this, createDingBean.getMsg(), Toast.LENGTH_SHORT).show(); Intent intent = new Intent(CartActivity.this, DingDanActivity.class); startActivity(intent); } else { Toast.makeText(CartActivity.this, createDingBean.getMsg(), Toast.LENGTH_SHORT).show(); } } }); } } }); } /** * 重写的购物车的方法 * * @param cartBean */ @Override public void onSuccess(final CartBean cartBean) { this.cartBean = cartBean; runOnUiThread(new Runnable() { @Override public void run() { List<CartBean.DataBean> cartList = cartBean.getData(); //数据获取成功后隐藏 progressBar.setVisibility(View.GONE); //如果购物有东西的时候 if (cartBean != null) { //1.设置适配器 adapter = new CartAdapter(CartActivity.this, cartBean, progressBar, cartPresenter, handler); cartTwoListView.setAdapter(adapter); //2.展开二级列表的数据 for (int i = 0; i < cartList.size(); i++) { cartTwoListView.expandGroup(i); } //3.设置组的初始状态 for (int i = 0; i < cartList.size(); i++) { //先找出当前数组中的所有的孩子 List<CartBean.DataBean.ListBean> listBeans = cartList.get(i).getList(); //根据孩子的状态设置组的初始状态是否选中 cartList.get(i).setGroupCheck(isAllChildInGroupCheck(listBeans));//把孩子都放进去 } //4.根据选中计算加减和数量(因为操作都是在适配器中进行,所以放到适配器里执行) adapter.sendPriceAndCount(); } else { Toast.makeText(CartActivity.this, "购物车是空的", Toast.LENGTH_SHORT).show(); } } }); } /** * 根据孩子listBeans ,设置组的初始状态是否选中 * * @param listBeans */ private boolean isAllChildInGroupCheck(List<CartBean.DataBean.ListBean> listBeans) { for (int i = 0; i < listBeans.size(); i++) { //只要有一个组未选中 返回false if (listBeans.get(i).getSelected() == 0) { return false; } } return true; } /** * 全选按钮的设置 * * @param v */ @Override public void onClick(View v) { switch (v.getId()) { case R.id.check_all: adapter.setAllCheck(check_all.isChecked());//根据选择的状态判断 break; } } }
//各种操作都放到适配器中:
适配器
//先来一级条目和二级条目的布局
一级条目的布局 : group_item.xml
<?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="wrap_content" android:orientation="horizontal"> <CheckBox android:id="@+id/group_check" android:layout_width="40dp" android:layout_height="40dp"/> <TextView android:id="@+id/group_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:text="商家"/> </LinearLayout>二级条目的布局: child_item.xml
<?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="wrap_content" android:orientation="horizontal"> <CheckBox android:id="@+id/child_check" android:layout_width="40dp" android:layout_height="40dp" android:layout_gravity="center"/> <ImageView android:id="@+id/child_image" android:layout_width="100dp" android:padding="10dp" android:layout_height="100dp" android:src="@mipmap/ic_launcher"/> <LinearLayout android:layout_width="0dp" android:layout_weight="3" android:layout_height="match_parent" android:padding="10dp" android:orientation="vertical"> <TextView android:id="@+id/child_title" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="1" android:text="标题"/> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:orientation="horizontal"> <TextView android:id="@+id/child_price" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:textColor="#f00" android:text="¥:0.00"/> <LinearLayout android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/child_jian" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:textSize="16sp" android:text="-"/> <TextView android:id="@+id/child_num" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:textSize="16sp" android:text="1"/> <TextView android:id="@+id/child_jia" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:textSize="16sp" android:text="+"/> </LinearLayout> </LinearLayout> </LinearLayout> <Button android:id="@+id/child_del" android:layout_width="50dp" android:layout_height="match_parent" android:text="删除" android:background="#f00" android:textColor="#fff"/> </LinearLayout>
购物车适配器:
/** * Created by Administrator * 购物车的适配器 */ public class CartAdapter extends BaseExpandableListAdapter{ private Handler handler; private CartPresenter cartPresenter; private RelativeLayout progressBar; private Context context; private CartBean cartBean; private int childIndex; private int allIndex; public CartAdapter(Context context, CartBean cartBean, RelativeLayout progressBar, CartPresenter cartPresenter, Handler handler) { this.context = context; this.cartBean = cartBean; this.progressBar = progressBar; this.cartPresenter = cartPresenter; this.handler = handler; } /** * 返回int就是长度 * 返回Object为对象 * 返回long为参数 * 返回Boolean都是true * @return */ @Override public int getGroupCount() { return cartBean.getData().size(); } @Override public int getChildrenCount(int groupPosition) { return cartBean.getData().get(groupPosition).getList().size(); } @Override public Object getGroup(int groupPosition) { return cartBean.getData().get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { return cartBean.getData().get(groupPosition).getList().get(childPosition); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { final GroupHolder holder; if (convertView == null){ holder = new GroupHolder(); convertView = View.inflate(context,R.layout.group_item,null); //找控件 holder.group_check = convertView.findViewById(R.id.group_check); holder.group_text = convertView.findViewById(R.id.group_text); convertView.setTag(holder); }else { holder = (GroupHolder) convertView.getTag(); } //赋值 final CartBean.DataBean groupBean = cartBean.getData().get(groupPosition); holder.group_text.setText(groupBean.getSellerName());//商家的名字 holder.group_check.setChecked(groupBean.isGroupCheck());//设置点击(自己在bean包里添加的isGroupCheck()) //商家的点击事件 holder.group_check.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //点击时先显示progressBar progressBar.setVisibility(View.VISIBLE); //根据商家的状态改变子条目的状态 一个一个更新,更新完一个之后再执行下一个 childIndex = 0; //根据集合中的数据和商家的点击状态 upDataAllChildInGroup(groupBean,holder.group_check.isChecked()); } }); return convertView; } /** * 更细子条目的数据 * @param groupBean * @param checked */ private void upDataAllChildInGroup(final CartBean.DataBean groupBean, final boolean checked) { //先得到所有的子条目 CartBean.DataBean.ListBean listBean = groupBean.getList().get(childIndex); Map<String, String> params = new HashMap<>(); //因为更新时所有的状态都可能改变,就都放到map里 params.put("uid", "2845"); params.put("sellerid", String.valueOf(listBean.getSellerid())); params.put("pid", String.valueOf(listBean.getPid())); params.put("selected", String.valueOf(checked ? 1 : 0));//如果选中就是1,否则为0(三元运算符) params.put("num", String.valueOf(listBean.getNum())); OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { //更新成功一条 if (response.isSuccessful()) { //索引增加 childIndex++; if (childIndex < groupBean.getList().size()) { //再去更新下一条 upDataAllChildInGroup(groupBean, checked); } else {//全都更新完成了....重新查询购物车 cartPresenter.getData(Api.SELECTART_API); } } } }); } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ChildHolder holder; if (convertView == null){ holder = new ChildHolder(); convertView = View.inflate(context,R.layout.child_item,null); //找控件 holder.child_check = convertView.findViewById(R.id.child_check); holder.child_image = convertView.findViewById(R.id.child_image); holder.child_title = convertView.findViewById(R.id.child_title); holder.child_price = convertView.findViewById(R.id.child_price); holder.child_jian = convertView.findViewById(R.id.child_jian); holder.child_num = convertView.findViewById(R.id.child_num); holder.child_jia = convertView.findViewById(R.id.child_jia); holder.child_del = convertView.findViewById(R.id.child_del); convertView.setTag(holder); }else { holder = (ChildHolder) convertView.getTag(); } //赋值 final CartBean.DataBean.ListBean childBean = cartBean.getData().get(groupPosition).getList().get(childPosition); holder.child_check.setChecked(childBean.getSelected() == 0 ? false:true); holder.child_title.setText(childBean.getTitle()); String[] split = childBean.getImages().split("\\|"); Glide.with(context).load(split[0]).into(holder.child_image); holder.child_price.setText("¥:"+childBean.getPrice()); holder.child_num.setText(childBean.getNum()+""); //CheckBox的点击 holder.child_check.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //点击时先显示progressBar progressBar.setVisibility(View.VISIBLE); Map<String, String> params = new HashMap<>(); params.put("uid", "2845"); params.put("sellerid", String.valueOf(childBean.getSellerid())); params.put("pid", String.valueOf(childBean.getPid())); params.put("selected", String.valueOf(childBean.getSelected() == 0 ? 1 : 0)); params.put("num", String.valueOf(childBean.getNum())); OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { //更新成功之后,,,,再次查询购物车的数据进行展示 if (response.isSuccessful()) { cartPresenter.getData(Api.SELECTART_API); } } }); } }); //加号的点击 holder.child_jia.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int num = childBean.getNum(); //此时需要显示进度条 progressBar.setVisibility(View.VISIBLE); //更新购物车,,,,需要改变是数量,,,,需要加1 Map<String, String> params = new HashMap<>(); //?uid=71&sellerid=1&pid=1&selected=0&num=10 params.put("uid", "2845"); params.put("sellerid", String.valueOf(childBean.getSellerid())); params.put("pid", String.valueOf(childBean.getPid())); params.put("selected", String.valueOf(childBean.getSelected())); params.put("num", String.valueOf(num + 1)); OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { //更新成功之后,,,,再次查询购物车的数据进行展示 if (response.isSuccessful()) { cartPresenter.getData(Api.SELECTART_API); } } }); } }); //减号的点击 holder.child_jian.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //点击加减时数据num也要改变 int num = childBean.getNum(); if (num == 1){//如果数据是1,就不能减了,不执行下面的逻辑 return; } //此时需要显示进度条 progressBar.setVisibility(View.VISIBLE); //更新购物车,,,,需要改变是数量,,,,需要加1 Map<String, String> params = new HashMap<>(); //?uid=71&sellerid=1&pid=1&selected=0&num=10 params.put("uid", "2845"); params.put("sellerid", String.valueOf(childBean.getSellerid())); params.put("pid", String.valueOf(childBean.getPid())); params.put("selected", String.valueOf(childBean.getSelected())); params.put("num", String.valueOf(num - 1)); OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { //更新成功之后,,,,再次查询购物车的数据进行展示 if (response.isSuccessful()) { cartPresenter.getData(Api.SELECTART_API); } } }); } }); //删除 holder.child_del.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //显示进度条 progressBar.setVisibility(View.VISIBLE); //调用删除的接口 Map<String, String> params = new HashMap<>(); //uid=72&pid=1 params.put("uid", "2845"); params.put("pid", String.valueOf(childBean.getPid())); OkHttp3Util.doPost(Api.DELETECART_API, params, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if (response.isSuccessful()) { //再次请求购物车的数据 cartPresenter.getData(Api.SELECTART_API); } } }); } }); return convertView; } /** * 计算价钱和数量 */ public void sendPriceAndCount() { double price = 0; int count = 0; for (int i = 0; i < cartBean.getData().size(); i++) { List<CartBean.DataBean.ListBean> listBeans = cartBean.getData().get(i).getList(); for (int j = 0; j < listBeans.size(); j++) { if (listBeans.get(j).getSelected() == 1) { price += listBeans.get(j).getPrice() * listBeans.get(j).getNum(); count += listBeans.get(j).getNum(); } } } //double高精度,,,计算的时候可能会出现一串数字...保留两位 DecimalFormat decimalFormat = new DecimalFormat("0.00"); String priceString = decimalFormat.format(price); CountPriceBean countPriceBean = new CountPriceBean(priceString, count); //发送到主页面进行显示 Message msg = Message.obtain(); msg.what = 0; msg.obj = countPriceBean; handler.sendMessage(msg); } /** * 全选反选的操作 * @param checked */ public void setAllCheck(boolean checked) { //创建一个大的结合,,,存放所有商品的数据 List<CartBean.DataBean.ListBean> allList = new ArrayList<>(); for (int i = 0; i < cartBean.getData().size(); i++) { List<CartBean.DataBean.ListBean> listBeans = cartBean.getData().get(i).getList(); for (int j = 0; j < listBeans.size(); j++) { allList.add(listBeans.get(j)); } } //显示progress progressBar.setVisibility(View.VISIBLE); //递归更新.... allIndex = 0; upDateAllChecked(allList, checked); } /** * 更新选择的操作 * @param allList * @param checked */ private void upDateAllChecked(final List<CartBean.DataBean.ListBean> allList, final boolean checked) { CartBean.DataBean.ListBean listBean = allList.get(allIndex); Map<String, String> params = new HashMap<>(); //?uid=71&sellerid=1&pid=1&selected=0&num=10 params.put("uid", "2845"); params.put("sellerid", String.valueOf(listBean.getSellerid())); params.put("pid", String.valueOf(listBean.getPid())); params.put("selected", String.valueOf(checked ? 1 : 0)); params.put("num", String.valueOf(listBean.getNum())); OkHttp3Util.doPost(Api.UpDateCart_API, params, new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { //更新一条成功 if (response.isSuccessful()) { allIndex++; if (allIndex < allList.size()) { //继续更新下一条 upDateAllChecked(allList, checked); } else { //重新查询 cartPresenter.getData(Api.SELECTART_API); } } } }); } public class GroupHolder{ CheckBox group_check; TextView group_text; } public class ChildHolder{ CheckBox child_check; ImageView child_image; TextView child_title; TextView child_price; TextView child_jian; TextView child_num; TextView child_jia; Button child_del; } }OK!到了这里之后,我们要的效果就出来了,还行吧!