购物车的实现案例

来源:互联网 发布:vb中left是什么意思 编辑:程序博客网 时间:2024/05/22 10:46

首先写上框架

package com.example.mr.yuekaomoni;import android.annotation.SuppressLint;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.CheckBox;import android.widget.LinearLayout;import android.widget.TextView;import com.example.mr.yuekaomoni.bean.Goubean;import com.example.mr.yuekaomoni.bean.Pricebean;import com.example.mr.yuekaomoni.utils.Gouwucard;import com.example.mr.yuekaomoni.utils.OkUrl;import com.google.gson.Gson;import java.io.IOException;import java.util.ArrayList;import java.util.List;import okhttp3.Call;import okhttp3.Callback;import okhttp3.Response;public class GouwuActivity extends AppCompatActivity {    private LinearLayout cang;    private Gouwucard card;    private CheckBox xuan;    private TextView heji;    private TextView jiesuan;    private List<Goubean.DataBean> data;    private List<List<Goubean.DataBean.ListBean>> list;    @SuppressLint("HandlerLeak")    Handler handler=new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);    if(msg.what==0){        Pricebean pricebean = (Pricebean) msg.obj;        heji.setText("合计:¥"+pricebean.getPrice());        jiesuan.setText("去结算("+pricebean.getCount()+")");    }else if(msg.what==55){        info();    }        }    };    private LinearLayout linearLayout;    private GouAdapter gouAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_gouwu);        cang = findViewById(R.id.cang);        card= findViewById(R.id.card);        xuan = findViewById(R.id.quanxuan);        heji = findViewById(R.id.heji);        jiesuan = findViewById(R.id.jiesuan);        linearLayout = findViewById(R.id.linear_layout);       xuan.setOnClickListener(new View.OnClickListener() {           @Override           public void onClick(View view) {             gouAdapter.quanxuan(xuan.isChecked());           }       });          card.setGroupIndicator(null);    }    @Override    protected void onResume() {        super.onResume();        info();    }    private void info() {        OkUrl.doget("https://www.zhaoapi.cn/product/getCarts?uid=2834", new Callback() {            @Override            public void onFailure(Call call, IOException e) {                e.printStackTrace();            }            @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() {                                 try {                                     Log.e("----", "run: "+string );                                     //判断是否为空                                     if(!string.equals("null")){                                         //隐藏                                         cang.setVisibility(View.GONE);                                         Gson gson = new Gson();                                         Goubean goubean = gson.fromJson(string, Goubean.class);                                         data = goubean.getData();                                            //创建子集合                                         list = new ArrayList<>();                                           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).setIscheck(true);                                                   }                                         }                                           //全选根据一级全部选中所选中                                         xuan.setChecked(isgroupstate());                                         //创建适配器                                         gouAdapter = new GouAdapter(data, list, handler, GouwuActivity.this);                                         card.setAdapter(gouAdapter);                                         //展示所有                                         for(int i=0;i<data.size();i++){                                             card.expandGroup(i);                                         }                                         gouAdapter.sendpriceanfcount();                                     }else{                                         linearLayout.setVisibility(View.GONE);                                     }                                 } catch (Exception e) {                                     e.printStackTrace();                                 }                             }                         });                  }            }        });    }   //判断二级是否全选    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).isIscheck()){                                 return false;                            }                        }                        return true;                    }}

适配器的编写方式

package com.example.mr.yuekaomoni;import android.content.Context;import android.icu.util.Measure;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.ImageView;import android.widget.TextView;import com.example.mr.yuekaomoni.bean.Goubean;import com.example.mr.yuekaomoni.bean.Pricebean;import com.example.mr.yuekaomoni.utils.ImagBase;import com.example.mr.yuekaomoni.utils.OkUrl;import com.nostra13.universalimageloader.core.ImageLoader;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import okhttp3.Call;import okhttp3.Callback;import okhttp3.Response;/** * Created by Mr赵 on 2017/12/20. */class GouAdapter extends BaseExpandableListAdapter {    private List<Goubean.DataBean> data;    private List<List<Goubean.DataBean.ListBean>> list;    Handler handler;    Context ctx;    private int index;    private int size;    private int chidesize;    private int childindex;    public GouAdapter(List<Goubean.DataBean> data, List<List<Goubean.DataBean.ListBean>> list, Handler handler, Context ctx) {        this.data = data;        this.list = list;        this.handler = handler;        this.ctx = ctx;    }    @Override    public int getGroupCount() {        return data.size();    }    @Override    public int getChildrenCount(int i) {        return list.get(i).size();    }    @Override    public Object getGroup(int i) {        return data.get(i);    }    @Override    public Object getChild(int i, int i1) {        return data.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 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 Groupholder gh;        if(view==null){            gh=new Groupholder();            view=View.inflate(ctx, R.layout.yijibuju,null);            gh.yiji_check=view.findViewById(R.id.yiji_check);            gh.text_yiji=view.findViewById(R.id.text_yiji);            view.setTag(gh);        }else{            gh= (Groupholder) view.getTag();        }           gh.text_yiji.setText(data.get(i).getSellerName());           gh.yiji_check.setChecked(data.get(i).isIscheck());           //点击一级状态改变耳机状态        gh.yiji_check.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //获取此组中所有自条目                chidesize = data.get(i).getList().size();                childindex = 0;                updataAllInGroup(gh.yiji_check.isChecked(),data.get(i));            }        });        return view;    }    private void updataAllInGroup(final boolean checked, final Goubean.DataBean dataBean) {        Goubean.DataBean.ListBean listBean = dataBean.getList().get(childindex);        //?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(checked?1:0));        params.put("num", String.valueOf(listBean.getNum()));        OkUrl.doPost("https://www.zhaoapi.cn/product/updateCarts", params, new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                if(response.isSuccessful()){                    index=index+1;                    if(index<size){                        updataAllInGroup(checked,dataBean);                    }else {                        Message obtain = Message.obtain();                        obtain.what=55;                        handler.sendMessage(obtain);                    }                }            }        });    }    /*    * 二级    * */    @Override    public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {        Childholder ch;        if(view==null){            ch=new Childholder();            view=View.inflate(ctx,R.layout.erjibuju,null);            ch.erji_check=view.findViewById(R.id.erji_check);            ch.erji_img=view.findViewById(R.id.erji_img);            ch.erji_tel=view.findViewById(R.id.erji_tel);            ch.erji_price=view.findViewById(R.id.erji_price);            ch.shan=view.findViewById(R.id.shan);            ch.text_jia=view.findViewById(R.id.text_add);            ch.text_num=view.findViewById(R.id.text_num);            ch.text_jian=view.findViewById(R.id.text_jian);            view.setTag(ch);        }else{            ch= (Childholder) view.getTag();        }        final Goubean.DataBean.ListBean listBean = data.get(i).getList().get(i1);        //复制        ch.erji_check.setChecked(listBean.getSelected()==0?false:true);        String[] split = listBean.getImages().split("\\|");        ImageLoader.getInstance().displayImage(split[0],ch.erji_img,ImagBase.getDefaultOption());        ch.erji_tel.setText(listBean.getTitle());        ch.erji_price.setText("¥:"+listBean.getBargainPrice());         ch.text_num.setText(listBean.getNum()+"");         //二级列表点击事件        ch.erji_check.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                updatachild(listBean);            }        });        ch.text_jia.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                upallNum(listBean,true);            }        });        ch.text_jian.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                if(listBean.getNum()==1){                    return;                }                upallNum(listBean,false);            }        });        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));        }        OkUrl.doPost("https://www.zhaoapi.cn/product/updateCarts", params, new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                if(response.isSuccessful()){                    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()));        OkUrl.doPost("https://www.zhaoapi.cn/product/updateCarts", params, new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                if(response.isSuccessful()){                    }else {                        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()));        OkUrl.doPost("https://www.zhaoapi.cn/product/updateCarts", params, new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                 if(response.isSuccessful()){                       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 Groupholder{        CheckBox yiji_check;        TextView text_yiji;  }  class Childholder{       CheckBox erji_check;       ImageView erji_img;       TextView erji_tel;       TextView erji_price;       Button shan;       TextView text_jian;       TextView text_jia;       TextView text_num;  }}
编写首页布局
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:background="#fff"    android:layout_height="match_parent">     <!--标题-->     <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/goubiao"              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" />     <!--登录-->     <LinearLayout         android:id="@+id/cang1"         android:layout_below="@+id/xian"         android:visibility="visible"         android:orientation="vertical"         android:layout_width="match_parent"         android:layout_height="wrap_content">     <LinearLayout         android:orientation="horizontal"         android:layout_width="match_parent"         android:layout_height="wrap_content">          <Button              android:id="@+id/deng"              android:text="登录"              android:layout_marginLeft="20dp"              android:layout_marginRight="10dp"              android:layout_width="wrap_content"              android:layout_height="wrap_content" />          <TextView              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:text="登陆后同步电脑与手机购物车中的商品"              />     </LinearLayout>     <TextView         android:id="@+id/xian2"         android:visibility="visible"         android:background="#e4e2e2"         android:layout_width="match_parent"         android:layout_height="2dp" />     </LinearLayout><!--存放是否为空-->  <FrameLayout      android:id="@+id/frame"      android:visibility="visible"      android:layout_below="@+id/cang1"      android:layout_width="match_parent"      android:layout_height="wrap_content"></FrameLayout><ScrollView    android:layout_below="@+id/cang1"    android:layout_above="@+id/linear_layout"    android:layout_width="match_parent"    android:layout_height="wrap_content">     <com.example.mr.zongheyemian.activitty.Goucarderjiliebiao         android:id="@+id/goucard"         android:layout_width="match_parent"         android:layout_height="wrap_content">     >     </com.example.mr.zongheyemian.activitty.Goucarderjiliebiao></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:gravity="center_vertical"    android:padding="10dp"    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:padding="10dp"    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" />    <ImageView        android:id="@+id/img_erji"        android:layout_centerVertical="true"        android:layout_toRightOf="@+id/check_erji"        android:layout_marginLeft="10dp"        android:layout_width="80dp"        android:layout_height="80dp" />    <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_alignBottom="@+id/img_erji"        android:text="¥0.00"        android:textColor="#ff0000"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <LinearLayout        android:layout_alignParentRight="true"        android:layout_alignBottom="@+id/img_erji"        android:orientation="horizontal"        android:layout_width="wrap_content"        android:layout_height="wrap_content">        <TextView            android:id="@+id/text_jian"            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/text_num"            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/text_add"            android:text="十"            android:padding="5dp"            android:background="@drawable/biangkuangxian"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />    </LinearLayout></RelativeLayout>
当点击状态/非点击状态
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">  <item android:state_checked="true" android:drawable="@drawable/g1"/>    <item android:state_checked="false" android:drawable="@drawable/g"/></selector>
自定义card控件
package com.example.mr.yuekaomoni.utils;import android.content.Context;import android.util.AttributeSet;import android.widget.ExpandableListView;/** * Created by Mr赵 on 2017/12/19. */public class Gouwucard extends ExpandableListView {    public Gouwucard(Context context) {        super(context);    }    public Gouwucard(Context context, AttributeSet attrs) {        super(context, attrs);    }    public Gouwucard(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);    }}