寫代碼前要先加上權限和依賴:
<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.+'因爲購物車的邏輯性很強,所以寫購物車之前要想清楚要寫哪一步,不然很容易蒙圈...
各種需要的工具類中的東西
一些可能用到的接口:
//加入購物車 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模式:
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; } }
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; } } }
//各種操作都放到適配器中:
適配器
<?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!到了這裏之後,我們要的效果就出來了,還行吧!