创建框架实现activity
package com.example.mr.xiangmu2_yuekaomoni; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.CheckBox; import android.widget.LinearLayout; import android.widget.TextView; import com.example.mr.xiangmu2_yuekaomoni.apdater.GouAdapter; import com.example.mr.xiangmu2_yuekaomoni.bean.Datadatabean; import com.example.mr.xiangmu2_yuekaomoni.bean.Goubean; import com.example.mr.xiangmu2_yuekaomoni.presenter.Gpjiekou; import com.example.mr.xiangmu2_yuekaomoni.presenter.Gpresenter; import com.example.mr.xiangmu2_yuekaomoni.utils.Goucard; import java.util.ArrayList; import java.util.List; public class GouActivity extends AppCompatActivity implements Gpjiekou { private Goucard goucard; private CheckBox quanxuan; private TextView heji; private TextView jiesuan; private Gpresenter gpresenter; private List<Goubean.DataBean> data; private List<List<Goubean.DataBean.ListBean>> list; Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(msg.what==0){ Pricebean price= (Pricebean) msg.obj; heji.setText("合计:"+price.getPrice()); jiesuan.setText("去结算("+price.getCount()+")"); }else if(msg.what==55){ info(); } } }; private GouAdapter gouAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_gou); initView(); } private void initView() { goucard = (Goucard) findViewById(R.id.goucard); quanxuan = (CheckBox) findViewById(R.id.quanxuan); heji = (TextView) findViewById(R.id.heji); jiesuan = (TextView) findViewById(R.id.jiesuan); //去样式 goucard.setGroupIndicator(null); //创建引用 gpresenter = new Gpresenter(this); quanxuan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { gouAdapter.quanxuan(quanxuan.isChecked()); } }); info(); } private void info() { gpresenter.getpaht(); } @Override public void cheng(Goubean json) { //获取集合 data = json.getData(); //创建集合添加子集合 list = new ArrayList<List<Goubean.DataBean.ListBean>>(); for (int i = 0; i< data.size(); i++){ list.add(data.get(i).getList()); } //循环二级列表判断是否选改变一级状态 for(int i=0;i<data.size();i++){ if(ischilserstate(i)){ data.get(i).setIschecd(true); } } //全选根据一级全部选中所选中 quanxuan.setChecked(isgroupstate()); //开启适配器 gouAdapter = new GouAdapter(handler,data,list,GouActivity.this); goucard.setAdapter(gouAdapter); //展示所有 for(int i=0;i<data.size();i++){ goucard.expandGroup(i); } //调取价钱方法 gouAdapter.sendpriceanfcount(); } //判断二级是否全选 private boolean ischilserstate(int i) { for(int j=0;j<data.get(i).getList().size();j++){ if(data.get(i).getList().get(j).getSelected()==0){ return false; } } return true; } //判断一级是否全部选中 private Boolean isgroupstate(){ for(int i=0;i<data.size();i++){ if(!data.get(i).isIschecd()){ return false; } } return true; } }
适配器
package com.example.mr.xiangmu2_yuekaomoni.apdater; import android.content.Context; import android.os.Handler; import android.os.Message; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.TextView; import android.widget.Toast; import com.example.mr.xiangmu2_yuekaomoni.Pricebean; import com.example.mr.xiangmu2_yuekaomoni.R; import com.example.mr.xiangmu2_yuekaomoni.bean.Goubean; import com.example.mr.xiangmu2_yuekaomoni.utils.Myretrofit; import com.example.mr.xiangmu2_yuekaomoni.utils.SerViceAPI; import com.facebook.drawee.view.SimpleDraweeView; import org.json.JSONObject; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; import static com.example.mr.xiangmu2_yuekaomoni.utils.Myretrofit.serViceAPI; /** * Created by Mr赵 on 2018/1/14. */ public class GouAdapter extends BaseExpandableListAdapter { Handler handler; List<Goubean.DataBean> data;; List<List<Goubean.DataBean.ListBean>> list; Context ctx; private int size; private int index; private int chidesize; private int childindex; public GouAdapter(Handler handler, List<Goubean.DataBean> data, List<List<Goubean.DataBean.ListBean>> list, Context ctx) { this.handler = handler; this.data = data; this.list = list; this.ctx = ctx; } @Override public int getGroupCount() { return data.size(); } @Override public int getChildrenCount(int da) { return list.get(da).size(); } @Override public Object getGroup(int da) { return data.get(da); } @Override public Object getChild(int da, int er) { return data.get(da).getList().get(er); } @Override public long getGroupId(int da) { return da; } @Override public long getChildId(int da, int er) { return er; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int i, int i1) { return true; } /* * 一级 * */ @Override public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) { final grophodel gh; if(view==null){ gh=new grophodel(); view=View.inflate(ctx, R.layout.yijibuju,null); gh.check_yiji = view.findViewById(R.id.check_yiji); gh.text_yiji = view.findViewById(R.id.text_yiji); view.setTag(gh); }else{ gh= (grophodel) view.getTag(); } //赋值 Goubean.DataBean dataBean = data.get(i); gh.text_yiji.setText(dataBean.getSellerName()); gh.check_yiji.setChecked(dataBean.isIschecd()); //点击一级状态改变耳机状态 gh.check_yiji.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //获取此组中所有自条目 chidesize = data.get(i).getList().size(); childindex = 0; updataAllInGroup(gh.check_yiji.isChecked(),data.get(i)); } }); return view; } private void updataAllInGroup(final boolean checked, final Goubean.DataBean dataBean) { Goubean.DataBean.ListBean listBean = dataBean.getList().get(childindex); Map<String, String> params=new HashMap<>(); params.put("uid","2834"); 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())); SerViceAPI serViceAPI = Myretrofit.getSerViceAPI(); Myretrofit.serViceAPI.getcha(params).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Goubean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Goubean datadatabean) { index = index +1; if(index < size){ updataAllInGroup(checked,dataBean); }else { Message obtain = Message.obtain(); obtain.what=55; handler.sendMessage(obtain); } } }); } /* * erji * */ @Override public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) { childehodel ch; if(view==null){ ch=new childehodel(); view=View.inflate(ctx, R.layout.erjibuju,null); ch.check_erji=view.findViewById(R.id.check_erji); ch.img_erji=view.findViewById(R.id.img_erji); ch.title_erji=view.findViewById(R.id.title_erji); ch.price_erji=view.findViewById(R.id.price_erji); ch.jia_erji=view.findViewById(R.id.jia_erji); ch.num_erji=view.findViewById(R.id.num_erji); ch.jian_erji=view.findViewById(R.id.jian_erji); ch.shan=view.findViewById(R.id.shan); view.setTag(ch); } else{ ch= (childehodel) view.getTag(); } final Goubean.DataBean.ListBean listBean = data.get(i).getList().get(i1); //复制 ch.check_erji.setChecked(listBean.getSelected()==0?false:true); ch.title_erji.setText(listBean.getTitle()); ch.price_erji.setText("¥:"+listBean.getBargainPrice()); ch.num_erji.setText(listBean.getNum()+""); String[] split = listBean.getImages().split("\\|"); ch.img_erji.setImageURI(split[0]); //二级列表点击事件 ch.check_erji.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { updatachild(listBean); } }); ch.jia_erji.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { upallNum(listBean,true); } }); ch.jian_erji.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(listBean.getNum()==1){ return; } upallNum(listBean,false); } }); //删除 ch.shan.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(listBean.getSelected()==1){ OkHttpClient okHttpClient = new OkHttpClient(); Request build = new Request.Builder() .url("http://120.27.23.105/product/deleteCart?uid=2834&pid=" + listBean.getPid() + "") .build(); okhttp3.Call call = okHttpClient.newCall(build); call.enqueue(new Callback() { @Override public void onFailure(okhttp3.Call call, IOException e) { } @Override public void onResponse(okhttp3.Call call, okhttp3.Response response) throws IOException { String string = response.body().string(); try { JSONObject jsonObject = new JSONObject(string); String msg = jsonObject.getString("msg"); if(msg.equals("删除购物车成功")){ //Toast.makeText(ctx,"已删除",Toast.LENGTH_SHORT).show(); Map<String, String> params=new HashMap<>(); params.put("uid","2834"); params.put("sellerid", String.valueOf(listBean.getSellerid())); params.put("pid", String.valueOf(listBean.getPid())); params.put("selected", String.valueOf(listBean.getSelected()==0?1:0)); params.put("num", String.valueOf(listBean.getNum())); SerViceAPI serViceAPI = Myretrofit.getSerViceAPI(); Myretrofit.serViceAPI.getcha(params).observeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Goubean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Goubean datadatabean) { Message obtain = Message.obtain(); obtain.what=55; handler.sendMessage(obtain); } }); }/*else{ Toast.makeText(ctx,"删除失败",Toast.LENGTH_SHORT).show(); }*/ } catch (Exception e) { e.printStackTrace(); } } }); }else{ Toast.makeText(ctx,"请勾选",Toast.LENGTH_SHORT).show(); } } }); return view; } private void upallNum(Goubean.DataBean.ListBean listBean, boolean b) { //?uid=71&sellerid=1&pid=1&selected=0&num=10 Map<String, String> params=new HashMap<>(); params.put("uid","2834"); params.put("sellerid", String.valueOf(listBean.getSellerid())); params.put("pid", String.valueOf(listBean.getPid())); params.put("selected", String.valueOf(listBean.getSelected())); if(b){ params.put("num", String.valueOf(listBean.getNum()+1)); }else{ params.put("num", String.valueOf(listBean.getNum()-1)); } SerViceAPI serViceAPI = Myretrofit.getSerViceAPI(); Myretrofit.serViceAPI.getcha(params).observeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Goubean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Goubean datadatabean) { Message obtain = Message.obtain(); obtain.what=55; handler.sendMessage(obtain); } }); } private void updatachild(Goubean.DataBean.ListBean listBean) { //?uid=71&sellerid=1&pid=1&selected=0&num=10 Map<String, String> params=new HashMap<>(); params.put("uid","2834"); params.put("sellerid", String.valueOf(listBean.getSellerid())); params.put("pid", String.valueOf(listBean.getPid())); params.put("selected", String.valueOf(listBean.getSelected()==0?1:0)); params.put("num", String.valueOf(listBean.getNum())); SerViceAPI serViceAPI= Myretrofit.getSerViceAPI(); Myretrofit.serViceAPI.getcha(params).observeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Goubean>() { public void onCompleted() { } public void onError(Throwable e) { } public void onNext(Goubean datadatabean) { Message obtain = Message.obtain(); obtain.what=55; handler.sendMessage(obtain); } }); } /* * 点击全选改变所有状态 * */ public void quanxuan(boolean checkee){ List<Goubean.DataBean.ListBean> liss=new ArrayList<>(); for (int i=0;i<data.size();i++){ for(int j=0;j<data.get(i).getList().size();j++){ liss.add(data.get(i).getList().get(j)); } } size = liss.size(); index =0; //通过递归更新自条目的选中 updateAllchilde(liss,checkee); } private void updateAllchilde(final List<Goubean.DataBean.ListBean> liss, final boolean checkee) { Goubean.DataBean.ListBean listBean = liss.get(index); //?uid=71&sellerid=1&pid=1&selected=0&num=10 Map<String, String> params=new HashMap<>(); params.put("uid","2834"); params.put("sellerid", String.valueOf(listBean.getSellerid())); params.put("pid", String.valueOf(listBean.getPid())); params.put("selected", String.valueOf(checkee?1:0)); params.put("num", String.valueOf(listBean.getNum())); SerViceAPI serViceAPI= Myretrofit.getSerViceAPI(); Myretrofit.serViceAPI.getcha(params).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Goubean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(Goubean datadatabean) { index = index +1; if(index < size){ updateAllchilde(liss,checkee); }else { Message obtain = Message.obtain(); obtain.what=55; handler.sendMessage(obtain); } } }); } /* * 计算金钱 **/ public void sendpriceanfcount(){ double price=0; int count=0; for(int i=0;i<data.size();i++){ for(int j=0;j<data.get(i).getList().size();j++){ if(data.get(i).getList().get(j).getSelected()==1){ price+=data.get(i).getList().get(j).getBargainPrice()*data.get(i).getList().get(j).getNum(); count+=data.get(i).getList().get(j).getNum(); } } } Pricebean pricebean = new Pricebean(price, count); Message obtain = Message.obtain(); obtain.what=0; obtain.obj=pricebean; handler.sendMessage(obtain); } /* * 优化 * */ class grophodel{ CheckBox check_yiji; TextView text_yiji; } class childehodel{ CheckBox check_erji; SimpleDraweeView img_erji; TextView title_erji; TextView price_erji; TextView jia_erji; TextView num_erji; TextView jian_erji; Button shan; } }
首页布局
<?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="com.example.mr.xiangmu2_yuekaomoni.GouActivity"> <!--标题--> <LinearLayout android:layout_alignParentTop="true" android:id="@+id/biaoti" android:padding="20dp" android:orientation="horizontal" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:text="购物车" android:textSize="25dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <ImageView android:background="@drawable/shp" android:layout_width="20dp" android:layout_height="20dp" /> </LinearLayout> <!--线--> <TextView android:id="@+id/xian" android:layout_below="@+id/biaoti" android:background="#e4e2e2" android:layout_width="match_parent" android:layout_height="2dp" /> <ScrollView android:layout_below="@+id/xian" android:layout_above="@+id/linear_layout" android:layout_width="match_parent" android:layout_height="wrap_content"> <com.example.mr.xiangmu2_yuekaomoni.utils.Goucard android:id="@+id/goucard" android:layout_width="match_parent" android:layout_height="wrap_content"> > </com.example.mr.xiangmu2_yuekaomoni.utils.Goucard> </ScrollView> <!--底部结算--> <LinearLayout android:id="@+id/linear_layout" android:layout_alignParentBottom="true" android:gravity="center_vertical" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="50dp"> <CheckBox android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:button="@null" android:background="@drawable/check_box_selector" android:id="@+id/quanxuan" android:layout_width="25dp" android:layout_height="25dp" /> <TextView android:id="@+id/heji" android:text="合计:¥0.00" android:layout_weight="2" android:layout_width="0dp" android:layout_height="wrap_content" /> <TextView android:text="去结算(0)" android:background="#ff0000" android:textColor="#ffffff" android:gravity="center" android:id="@+id/jiesuan" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" /> </LinearLayout> </RelativeLayout>
一级布局
<?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"> <CheckBox android:button="@null" android:id="@+id/check_yiji" android:background="@drawable/check_box_selector" android:layout_width="25dp" android:layout_height="25dp" /> <TextView android:layout_marginLeft="10dp" android:text="京东自营" android:id="@+id/text_yiji" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>二级布局<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <CheckBox android:layout_centerVertical="true" android:id="@+id/check_erji" android:button="@null" android:background="@drawable/check_box_selector" android:layout_width="25dp" android:layout_height="25dp" /> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/img_erji" android:layout_centerVertical="true" android:layout_toRightOf="@+id/check_erji" android:layout_marginLeft="10dp" android:layout_width="90dp" android:layout_height="90dp" /> <TextView android:id="@+id/title_erji" android:layout_toRightOf="@+id/img_erji" android:layout_marginLeft="10dp" android:layout_alignTop="@+id/img_erji" android:maxLines="2" android:minLines="2" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/price_erji" android:layout_toRightOf="@+id/img_erji" android:layout_marginLeft="10dp" android:layout_below="@+id/title_erji" android:text="¥0.00" android:textColor="#ff0000" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <LinearLayout android:layout_marginLeft="10dp" android:layout_below="@+id/price_erji" android:layout_toRightOf="@+id/img_erji" android:layout_alignBottom="@+id/img_erji" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/jian_erji" android:text="一" android:padding="5dp" android:background="@drawable/biangkuangxian" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:gravity="center" android:id="@+id/num_erji" android:paddingLeft="10dp" android:paddingRight="10dp" android:text="1" android:background="@drawable/biangkuangxian" android:layout_width="wrap_content" android:layout_height="match_parent" /> <TextView android:id="@+id/jia_erji" android:text="十" android:padding="5dp" android:background="@drawable/biangkuangxian" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> <Button android:layout_alignBottom="@+id/img_erji" android:background="#f00" android:textColor="#fff" android:id="@+id/shan" android:layout_alignParentRight="true" android:text="删除" android:layout_width="wrap_content" android:layout_height="30dp" /> </RelativeLayout>自定义布局package com.example.mr.xiangmu2_yuekaomoni.utils; import android.content.Context; import android.util.AttributeSet; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; /** * Created by Mr赵 on 2018/1/14. */ public class Goucard extends ExpandableListView{ public Goucard(Context context) { super(context); } public Goucard(Context context, AttributeSet attrs) { super(context, attrs); } public Goucard(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int i = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, i); } }