首先是主页面布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:id="@+id/cart_title" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="购物车" android:textSize="30sp" android:textStyle="bold" android:layout_alignParentLeft="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btn_redact" android:layout_alignParentRight="true" android:text="编辑" android:textSize="30sp" android:textStyle="bold" /> </RelativeLayout> <!--<android.support.v7.widget.RecyclerView--> <!--android:layout_below="@+id/cart_title"--> <!--android:layout_width="match_parent"--> <!--android:layout_height="match_parent"--> <!--android:layout_above="@+id/redactlayout"--> <!--android:id="@+id/cart_recycler">--> <!--</android.support.v7.widget.RecyclerView>--> <ExpandableListView android:layout_below="@+id/cart_title" android:id="@+id/expand_able_view" android:layout_width="match_parent" android:layout_height="match_parent"/> <LinearLayout android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/redactlayout" android:orientation="horizontal"> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/checkall" android:text="全选" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/goods_money" android:text="¥0" /> </LinearLayout> </RelativeLayout>
其次是组的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <CheckBox android:focusable="false" android:id="@+id/group_check" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
子的布局
主页面逻辑代码<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <CheckBox android:layout_width="50dp" android:layout_height="50dp" android:layout_gravity="center" android:gravity="center" android:id="@+id/mycheck" android:layout_marginLeft="10dp" /> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/cart_goods_head" android:layout_width="150dp" android:layout_height="150dp" android:layout_marginTop="15dp" fresco:actualImageScaleType="centerCrop" fresco:placeholderImage="@drawable/icon_placeholder" fresco:placeholderImageScaleType="fitCenter" fresco:roundingBorderWidth="5dp" android:layout_alignParentTop="true" android:layout_toRightOf="@+id/id_num" android:layout_margin="10dp" android:layout_alignParentRight="true" android:layout_alignParentEnd="true" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_gravity="center" android:gravity="center" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/cart_goods_name" android:text="名字" android:layout_gravity="center" android:gravity="center" android:textSize="18sp" android:textStyle="bold" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > <Button android:layout_width="40dp" android:layout_height="40dp" android:text="——" android:id="@+id/btn_reducegoodsnum" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/cart_goods_num" android:text="1" /> <Button android:layout_width="40dp" android:layout_height="40dp" android:text="+" android:id="@+id/btn_addgoodsnum" /> <Button android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btn_deletegoods" android:text="删除" /> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/cart_goods_price" android:text="$1000" android:textSize="18sp" android:textStyle="bold" /> </LinearLayout> </LinearLayout>
public class Fragment_cart extends Fragment implements ICartView { View view; CartPresenter userpresenter; //RecyclerView recyclerView; ArrayList<GetCartBean.DataBean> mlist; //MyCartRecyclerAdapter adapter; Button btn_redact; LinearLayout redactlayout; CheckBox checkall; boolean isgone = false; boolean ischeckall = false; ExpandableListView expandableListView; MyExpandAdapter adapter; TextView money; String user_id; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { view = inflater.inflate(R.layout.item_cart,null); btn_redact = view.findViewById(R.id.btn_redact); redactlayout = view.findViewById(R.id.redactlayout); expandableListView = view.findViewById(R.id.expand_able_view); money = view.findViewById(R.id.goods_money); checkall = view.findViewById(R.id.checkall); redactlayout.setVisibility(View.GONE); // recyclerView =(RecyclerView) view.findViewById(R.id.cart_recycler); // recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); userpresenter = new CartPresenter(this); user_id = SharedPreferencesUtils.getParam(getActivity(), "USER_ID", "").toString(); Log.d("Main","==================="+user_id); Map<String,String> mmap = new HashMap<String, String>(); mmap.put("uid",user_id); userpresenter.getUrl(API.API_GOODS,mmap); btn_redact.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(isgone==false){ redactlayout.setVisibility(View.VISIBLE); btn_redact.setText("完成"); isgone = true; }else{ redactlayout.setVisibility(View.GONE); btn_redact.setText("编辑"); for(int i = 0 ; i < mlist.size();i++){ for(int j = 0 ; j < mlist.get(i).getList().size();j++){ Map<String,String> mmap = new HashMap<String, String>(); mmap.put("uid",user_id); mmap.put("sellerid",mlist.get(i).getList().get(j).getSellerid()); mmap.put("pid",mlist.get(i).getList().get(j).getPid()); mmap.put("num",mlist.get(i).getList().get(j).getNum()); mmap.put("selected",mlist.get(i).getList().get(j).getSelected()); Retrofit retrofit = new Retrofit.Builder().baseUrl(API.API_GOODS).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build(); ApiService apiService = retrofit.create(ApiService.class); Observable<UpCartDataBean> upCartDataBeanObservable = apiService.upCart("product/updateCarts", mmap); upCartDataBeanObservable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<UpCartDataBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(UpCartDataBean upCartDataBean) { Toast.makeText(getActivity(), upCartDataBean.getMsg().toString(), Toast.LENGTH_SHORT).show(); } }); } } isgone = false; } } }); checkall.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { float allmoney = 0; if(ischeckall == false){ for(int i = 0 ; i < mlist.size(); i++){ for(int j = 0 ; j < mlist.get(i).getList().size();j++){ mlist.get(i).getList().get(0).setSelected("1"); } } for(int j = 0 ; j < mlist.size();j++){ for(int k = 0 ; k < mlist.get(j).getList().size(); k++){ if(mlist.get(j).getList().get(k).getSelected().equals("1")){ float price = Float.parseFloat(mlist.get(j).getList().get(k).getPrice()); int num = Integer.parseInt(mlist.get(j).getList().get(k).getNum()); allmoney+=price*num; } } } money.setText("¥"+allmoney+""); ischeckall = true; }else{ for(int i = 0 ; i < mlist.size(); i++){ for(int j = 0 ; j < mlist.get(i).getList().size();j++){ mlist.get(i).getList().get(0).setSelected("0"); } } money.setText("¥"+allmoney+""); ischeckall = false; } adapter.notifyDataSetChanged(); } }); return view; } @Override public void getData(GetCartBean list) { mlist = new ArrayList<>(); mlist = (ArrayList<GetCartBean.DataBean>) list.getData(); Log.d("Main","+================="+mlist.get(0).getList().toString()); //adapter = new MyCartRecyclerAdapter(mlist,getActivity()); //recyclerView.setAdapter(adapter); adapter = new MyExpandAdapter(getActivity(),mlist,money,checkall); expandableListView.setAdapter(adapter); } }
适配器逻辑代码
public class MyExpandAdapter extends BaseExpandableListAdapter { Context context; ArrayList<GetCartBean.DataBean> list; boolean ischeck = false; boolean isgroupcheckall = false; TextView textView; CheckBox checkall; public MyExpandAdapter(Context context, ArrayList<GetCartBean.DataBean> list,TextView textView,CheckBox checkall) { this.context = context; this.list = list; this.textView=textView; this.checkall = checkall; } @Override public int getGroupCount() { return list.size(); } @Override public int getChildrenCount(int i) { return list.get(i).getList().size(); } @Override public Object getGroup(int i) { return list.get(i); } @Override public Object getChild(int i, int i1) { return list.get(i).getList().get(i1); } @Override public long getGroupId(int i) { return i; } @Override public long getChildId(int i, int i1) { return i1; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) { GroupHolder holder = null; if (view == null){ view = LayoutInflater.from(context).inflate(R.layout.item_cart_group,viewGroup,false); holder = new GroupHolder(); holder.checkBox = (CheckBox) view.findViewById(R.id.group_check); view.setTag(holder); }else{ holder = (GroupHolder) view.getTag(); } holder.checkBox.setText(list.get(i).getSellerName()); holder.checkBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(isgroupcheckall == false){ for(int j = 0 ; j < list.get(i).getList().size();j++){ list.get(i).getList().get(j).setSelected("1"); } isgroupcheckall = true; }else{ for(int j = 0 ; j < list.get(i).getList().size();j++){ list.get(i).getList().get(j).setSelected("0"); } isgroupcheckall = false; } changeMoney(); int checksize = 0; int allchecksize = 0; for(int j = 0 ; j < list.size();j++){ for(int k = 0 ; k < list.get(j).getList().size(); k++){ allchecksize++; if(list.get(j).getList().get(k).getSelected().equals("1")){ checksize++; } } } if(checksize == allchecksize){ checkall.setChecked(true); }else{ checkall.setChecked(false); } checksize =0; allchecksize = 0; notifyDataSetChanged(); } }); return view; } @Override public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) { ChildHolder holder = null; if (view == null){ view = LayoutInflater.from(context).inflate(R.layout.item_cart_child,viewGroup,false); holder = new ChildHolder(); holder.goods_head = view.findViewById(R.id.cart_goods_head); holder.goods_name = view.findViewById(R.id.cart_goods_name); holder.goods_num = view.findViewById(R.id.cart_goods_num); holder.goods_price = view.findViewById(R.id.cart_goods_price); holder.mycheck = view.findViewById(mycheck); holder.btn_add = view.findViewById(R.id.btn_addgoodsnum); holder.btn_reduce = view.findViewById(R.id.btn_reducegoodsnum); holder.btn_delete = view.findViewById(R.id.btn_deletegoods); view.setTag(holder); }else{ holder = (ChildHolder) view.getTag(); } holder.goods_name.setText(list.get(i).getList().get(i1).getTitle()); holder.goods_num.setText(list.get(i).getList().get(i1).getNum()); holder.goods_price.setText(list.get(i).getList().get(i1).getPrice()); Uri uri = Uri.parse(list.get(i).getList().get(i1).getImages()); holder.goods_head.setImageURI(uri); String selected = list.get(i).getList().get(i1).getSelected(); if(selected.equals("0")){ ischeck = false; }else{ ischeck = true; } holder.mycheck.setChecked(ischeck); holder.btn_delete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String user_id = SharedPreferencesUtils.getParam(context, "USER_ID", "").toString(); Map<String,String> mmap = new HashMap<String, String>(); mmap.put("uid",user_id); mmap.put("pid",list.get(i).getList().get(i1).getPid()); Toast.makeText(context, "删除了啊", Toast.LENGTH_SHORT).show(); Retrofit retrofit = new Retrofit.Builder().baseUrl(API.API_GOODS).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build(); ApiService apiService = retrofit.create(ApiService.class); Observable<DeleteCartBean> deleteCartBeanObservable = apiService.deleteCart("product/deleteCart", mmap); deleteCartBeanObservable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<DeleteCartBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(DeleteCartBean deleteCartBean) { Toast.makeText(context, deleteCartBean.getMsg(), Toast.LENGTH_SHORT).show(); } }); if(list.get(i).getList() == null){ list.remove(i); } list.get(i).getList().remove(i1); notifyDataSetChanged(); } }); holder.mycheck.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(list.get(i).getList().get(i1).getSelected().equals("0")){ list.get(i).getList().get(i1).setSelected("1"); }else{ list.get(i).getList().get(i1).setSelected("0"); } changeMoney(); int checksize = 0; int allchecksize = 0; for(int j = 0 ; j < list.size();j++){ for(int k = 0 ; k < list.get(j).getList().size(); k++){ allchecksize++; if(list.get(j).getList().get(k).getSelected().equals("1")){ checksize++; } } } if(checksize == allchecksize){ checkall.setChecked(true); }else{ checkall.setChecked(false); } checksize =0; allchecksize = 0; notifyDataSetChanged(); } }); holder.btn_add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String nownum = list.get(i).getList().get(i1).getNum(); int num = Integer.parseInt(nownum); list.get(i).getList().get(i1).setNum(++num+""); changeMoney(); notifyDataSetChanged(); } }); holder.btn_reduce.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(list.get(i).getList().get(i1).getNum().equals("1")){ list.get(i).getList().get(i1).setNum("1"); }else{ String nownum = list.get(i).getList().get(i1).getNum(); int num = Integer.parseInt(nownum); list.get(i).getList().get(i1).setNum(--num+""); } changeMoney(); notifyDataSetChanged(); } }); return view; } public void changeMoney(){ float allmoney = 0; for(int j = 0 ; j < list.size();j++){ for(int k = 0 ; k < list.get(j).getList().size(); k++){ if(list.get(j).getList().get(k).getSelected().equals("1")){ float price = Float.parseFloat(list.get(j).getList().get(k).getPrice()); int num = Integer.parseInt(list.get(j).getList().get(k).getNum()); allmoney+=price*num; } } } textView.setText("¥"+allmoney+""); } @Override public boolean isChildSelectable(int i, int i1) { return true; } class GroupHolder { CheckBox checkBox; } class ChildHolder{ SimpleDraweeView goods_head; TextView goods_name,goods_num,goods_price; CheckBox mycheck; Button btn_add,btn_reduce,btn_delete; } }