购物车的实现案例
創建框架實現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);} }總結
- 上一篇: 接口统计模板
- 下一篇: python画条状图_Python 绘制