一级购物车(自定义view和自定义拦截器interceptor)

自定义拦截器interceptor

[java]  view plain  copy
  1. public class MyInterceptor implements Interceptor {  
  2.     @Override  
  3.     public Response intercept(Chain chain) throws IOException {  
  4.        Request ysRequest = chain.request();  
  5.         FormBody body = (FormBody) ysRequest.body();  
  6.         FormBody.Builder builder = new FormBody.Builder();  
  7.   
  8.         for (int i = 0; i <body.size(); i++) {  
  9.             String name = body.name(i);  
  10.             String value = body.value(i);  
  11.             builder.add(name,value);  
  12.         }  
  13.          builder.add("uri","evaluation");  
  14.         FormBody formBody = builder.build();  
  15.         Request request = new Request.Builder().url(ysRequest.url()).post(formBody).build();  
  16.         return chain.proceed(request);  
  17.     }  
  18. }  

单列模式的网络请求(OkHttp)

[java]  view plain  copy
  1. package bwie.com.yijicart.net;  
  2.   
  3. import java.util.Map;  
  4.   
  5. import okhttp3.Callback;  
  6. import okhttp3.FormBody;  
  7. import okhttp3.OkHttpClient;  
  8. import okhttp3.Request;  
  9.   
  10.   
  11. public class HttpUtils {  
  12.     private static HttpUtils httpUtils;  
  13.     private final OkHttpClient client;  
  14.   
  15.     private HttpUtils() {  
  16.         /** 
  17.          * okhttp请求+自定义拦截器 
  18.          */  
  19.         client = new OkHttpClient.Builder().addInterceptor(new MyInterceptor()).build();  
  20.     }  
  21.   
  22.     public static HttpUtils getHttpUtils(){  
  23.         if(httpUtils==null){  
  24.             synchronized (HttpUtils.class){  
  25.                 httpUtils=new HttpUtils();  
  26.             }  
  27.         }  
  28.         return httpUtils;  
  29.     }  
  30.     public void doPost(String url, Map<String,String>map, Callback callback){  
  31.         FormBody.Builder builder = new FormBody.Builder();  
  32.         for (Map.Entry<String,String> e:map.entrySet()) {  
  33.             builder.add(e.getKey(),e.getValue());  
  34.         }  
  35.         FormBody formBody = builder.build();  
  36.   
  37.         Request request = new Request.Builder().url(url).post(formBody).build();  
  38.         client.newCall(request).enqueue(callback);  
  39.   
  40.   
  41.     }  
  42. }  
自定义View的布局(购物车的加减)
[java]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="horizontal" android:layout_width="wrap_content"  
  4.     android:layout_height="wrap_content">  
  5.     <ImageView  
  6.         android:id="@+id/jian"  
  7.         android:layout_width="20dp"  
  8.         android:layout_height="20dp"  
  9.         android:src="@drawable/shopcart_minus_grey" />  
  10.   
  11.     <TextView  
  12.         android:id="@+id/tv_num"  
  13.         android:layout_width="wrap_content"  
  14.         android:layout_height="wrap_content"  
  15.         android:layout_marginLeft="5dp"  
  16.         android:background="@drawable/shopcart_add_btn"  
  17.         android:paddingBottom="2dp"  
  18.         android:paddingLeft="20dp"  
  19.         android:paddingRight="20dp"  
  20.         android:paddingTop="2dp"  
  21.         android:text="1" />  
  22.   
  23.     <ImageView  
  24.         android:id="@+id/jia"  
  25.         android:layout_width="20dp"  
  26.         android:layout_height="20dp"  
  27.         android:layout_marginLeft="5dp"  
  28.         android:src="@drawable/shopcart_add_red" />  
  29.     <Button  
  30.         android:id="@+id/del"  
  31.         android:text="删除"  
  32.         android:layout_marginLeft="10dp"  
  33.         android:layout_width="wrap_content"  
  34.         android:layout_height="wrap_content" />  
  35. </LinearLayout>  

自定义View

[java]  view plain  copy
  1. package bwie.com.yijicart.view;  
  2.   
  3. import android.content.Context;  
  4. import android.util.AttributeSet;  
  5. import android.view.LayoutInflater;  
  6. import android.view.View;  
  7. import android.widget.Button;  
  8. import android.widget.ImageView;  
  9. import android.widget.LinearLayout;  
  10. import android.widget.TextView;  
  11.   
  12. import bwie.com.yijicart.R;  
  13.   
  14.   
  15. public class MyView extends LinearLayout {  
  16.   
  17.     private ImageView jia;  
  18.     private ImageView jian;  
  19.     private TextView tv_num;  
  20.     private Button del;  
  21.   
  22.     public MyView(Context context) {  
  23.         this(context,null);  
  24.     }  
  25.   
  26.     public MyView(Context context, AttributeSet attrs) {  
  27.         super(context, attrs);  
  28.         View view = LayoutInflater.from(context).inflate(R.layout.zyitem, this);  
  29.         jia = view.findViewById(R.id.jia);  
  30.         jian = view.findViewById(R.id.jian);  
  31.         tv_num = view.findViewById(R.id.tv_num);  
  32.         del = view.findViewById(R.id.del);  
  33.     }  
  34.     public void addClickListener(OnClickListener onClickListener){  
  35.         jia.setOnClickListener(onClickListener);  
  36.     }  
  37.     public void jianClickListener(OnClickListener onClickListener){  
  38.         jian.setOnClickListener(onClickListener);  
  39.     }  
  40.     public void delClickListener(OnClickListener onClickListener){  
  41.         del.setOnClickListener(onClickListener);  
  42.     }  
  43.     public void setNum(String num) {  
  44.         tv_num.setText(num);  
  45.     }  
  46.   
  47.     public int getNum() {  
  48.         String num = tv_num.getText().toString();  
  49.         return Integer.parseInt(num);  
  50.     }  
  51. }  

activity—main的布局

[java]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:id="@+id/activity_main"  
  5.     android:layout_width="match_parent"  
  6.     android:layout_height="match_parent"  
  7.     android:orientation="vertical"  
  8.     android:paddingBottom="@dimen/activity_vertical_margin"  
  9.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  10.     android:paddingRight="@dimen/activity_horizontal_margin"  
  11.     android:paddingTop="@dimen/activity_vertical_margin"  
  12.     tools:context="bwie.com.yijicart.view.MainActivity">  
  13.     <android.support.v7.widget.RecyclerView  
  14.         android:id="@+id/rlv"  
  15.         android:layout_weight="1"  
  16.         android:layout_width="match_parent"  
  17.         android:layout_height="match_parent">  
  18.   
  19.     </android.support.v7.widget.RecyclerView>  
  20.     <LinearLayout  
  21.         android:layout_weight="9"  
  22.         android:orientation="horizontal"  
  23.         android:layout_width="match_parent"  
  24.         android:layout_height="match_parent">  
  25.   
  26.         <CheckBox  
  27.             android:id="@+id/quanxuan"  
  28.             android:layout_width="wrap_content"  
  29.             android:layout_height="wrap_content"  
  30.             />  
  31.   
  32.         <TextView  
  33.             android:layout_marginLeft="5dp"  
  34.             android:text="全选"  
  35.             android:layout_width="wrap_content"  
  36.             android:layout_height="wrap_content" />  
  37.         <TextView  
  38.             android:id="@+id/zongji"  
  39.             android:layout_marginLeft="80dp"  
  40.             android:text="合计:0"  
  41.             android:layout_width="wrap_content"  
  42.             android:layout_height="wrap_content" />  
  43.         <TextView  
  44.             android:layout_marginLeft="100dp"  
  45.             android:id="@+id/heji"  
  46.             android:text="结算(0)"  
  47.             android:gravity="center"  
  48.             android:background="@color/colorAccent"  
  49.             android:layout_width="wrap_content"  
  50.             android:layout_height="match_parent" />  
  51.     </LinearLayout>  
  52. </LinearLayout>  

MainActivity

[java]  view plain  copy
  1. <span style="font-size:14px;">package bwie.com.yijicart.view;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v7.app.AppCompatActivity;  
  5. import android.support.v7.widget.LinearLayoutManager;  
  6. import android.support.v7.widget.RecyclerView;  
  7. import android.view.View;  
  8. import android.widget.CheckBox;  
  9. import android.widget.LinearLayout;  
  10. import android.widget.TextView;  
  11.   
  12. import org.greenrobot.eventbus.EventBus;  
  13. import org.greenrobot.eventbus.Subscribe;  
  14.   
  15. import java.util.List;  
  16.   
  17. import bwie.com.yijicart.R;  
  18. import bwie.com.yijicart.adapter.Myadapter;  
  19. import bwie.com.yijicart.bean.CountPrice;  
  20. import bwie.com.yijicart.bean.GoodsBean;  
  21. import bwie.com.yijicart.bean.MessageEvent;  
  22. import bwie.com.yijicart.persenter.GoodsPersenter;  
  23. import bwie.com.yijicart.view.IMain.IMain;  
  24.   
  25. public class MainActivity extends AppCompatActivity implements IMain, View.OnClickListener {  
  26.   
  27.     private RecyclerView mRlv;  
  28.     private CheckBox mQuanxuan;  
  29.     /** 
  30.      * 合计:0 
  31.      */  
  32.     private TextView mZongji;  
  33.     /** 
  34.      * 结算(0) 
  35.      */  
  36.     private TextView mHeji;  
  37.     private LinearLayout mActivityMain;  
  38.     private Myadapter myadapter;  
  39.   
  40.     @Override  
  41.     protected void onCreate(Bundle savedInstanceState) {  
  42.         super.onCreate(savedInstanceState);  
  43.         setContentView(R.layout.activity_main);  
  44.         EventBus.getDefault().register(this);  
  45.         initView();  
  46.         new GoodsPersenter(this).getGoods();  
  47.   
  48.     }  
  49.   
  50.     @Override  
  51.     public void showList(List<GoodsBean.DataBean.DatasBean> list) {  
  52.         mRlv.setLayoutManager(new LinearLayoutManager(this));  
  53.         myadapter = new Myadapter(this, list);  
  54.         mRlv.setAdapter(myadapter);  
  55.     }  
  56.   
  57.     private void initView() {  
  58.         mRlv = (RecyclerView) findViewById(R.id.rlv);  
  59.         mQuanxuan = (CheckBox) findViewById(R.id.quanxuan);  
  60.         mQuanxuan.setOnClickListener(this);  
  61.         mZongji = (TextView) findViewById(R.id.zongji);  
  62.         mHeji = (TextView) findViewById(R.id.heji);  
  63.         mActivityMain = (LinearLayout) findViewById(R.id.activity_main);  
  64.     }  
  65.   
  66.     @Override  
  67.     public void onClick(View v) {  
  68.         switch (v.getId()) {  
  69.             default:  
  70.                 break;  
  71.             case R.id.quanxuan:  
  72.                 myadapter.UpdateAllCheck(mQuanxuan.isChecked());  
  73.                 break;  
  74.         }  
  75.     }  
  76.   @Subscribe  
  77.   public void onMessageEvent(MessageEvent event){  
  78.       mQuanxuan.setChecked(event.isCheck());  
  79.   }  
  80.     @Subscribe  
  81.     public void onMessageEvent(CountPrice cp){  
  82.         mZongji.setText("总价:"+cp.getPrice()+"元");  
  83.         mHeji.setText("结算("+cp.getCount()+")");  
  84.     }  
  85.     @Override  
  86.     protected void onDestroy() {  
  87.         super.onDestroy();  
  88.         EventBus.getDefault().unregister(this);  
  89.     }  
  90. }</span>  
适配器的布局

[java]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="horizontal" android:layout_width="match_parent"  
  4.     android:layout_marginLeft="20dp"  
  5.     android:background="#FFEEE718"  
  6.     android:layout_marginTop="15dp"  
  7.     android:layout_height="wrap_content">  
  8.     <CheckBox  
  9.         android:id="@+id/gx"  
  10.         android:layout_marginLeft="25dp"  
  11.         android:layout_width="wrap_content"  
  12.         android:layout_height="wrap_content" />  
  13.     <LinearLayout  
  14.         android:orientation="vertical"  
  15.         android:layout_width="wrap_content"  
  16.         android:layout_height="wrap_content">  
  17.         <TextView  
  18.             android:id="@+id/name2"  
  19.             android:layout_marginLeft="20dp"  
  20.             android:layout_width="wrap_content"  
  21.             android:layout_height="wrap_content" />  
  22.   
  23.         <TextView  
  24.             android:id="@+id/time"  
  25.             android:layout_marginLeft="20dp"  
  26.             android:layout_width="wrap_content"  
  27.             android:layout_height="wrap_content" />  
  28.         <TextView  
  29.             android:id="@+id/price"  
  30.             android:layout_marginLeft="20dp"  
  31.             android:layout_width="wrap_content"  
  32.             android:layout_height="wrap_content" />  
  33.     </LinearLayout>  
  34.   
  35.   
  36.      <bwie.com.yijicart.view.MyView  
  37.          android:id="@+id/myView"  
  38.          android:layout_gravity="center_vertical"  
  39.          android:layout_marginLeft="20dp"  
  40.          android:layout_width="wrap_content"  
  41.          android:layout_height="wrap_content">  
  42.   
  43.      </bwie.com.yijicart.view.MyView>  
  44.   
  45.   
  46.   
  47.   
  48. </LinearLayout>  
适配器

[java]  view plain  copy
  1. package bwie.com.yijicart.adapter;  
  2.   
  3. import android.content.Context;  
  4. import android.support.v7.widget.RecyclerView;  
  5. import android.view.LayoutInflater;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8. import android.widget.CheckBox;  
  9. import android.widget.TextView;  
  10.   
  11. import org.greenrobot.eventbus.EventBus;  
  12.   
  13. import java.util.List;  
  14.   
  15. import bwie.com.yijicart.R;  
  16. import bwie.com.yijicart.bean.CountPrice;  
  17. import bwie.com.yijicart.bean.GoodsBean;  
  18. import bwie.com.yijicart.bean.MessageEvent;  
  19. import bwie.com.yijicart.view.MyView;  
  20.   
  21. import static bwie.com.yijicart.R.id.price;  
  22.   
  23.   
  24. public class Myadapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{  
  25.     private Context context;  
  26.     private List<GoodsBean.DataBean.DatasBean> list;  
  27.   
  28.     public Myadapter(Context context, List<GoodsBean.DataBean.DatasBean> list) {  
  29.         this.context = context;  
  30.         this.list = list;  
  31.     }  
  32.   
  33.     @Override  
  34.     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {  
  35.         View view = LayoutInflater.from(context).inflate(R.layout.childitem, parent, false);  
  36.         return new MyViewHodler(view);  
  37.     }  
  38.   
  39.     @Override  
  40.     public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {  
  41.         final GoodsBean.DataBean.DatasBean datasBean = list.get(position);  
  42.         final MyViewHodler myViewHodler= (MyViewHodler) holder;  
  43.   
  44.         myViewHodler.gx.setChecked(datasBean.isCheck());  
  45.         myViewHodler.tv_name.setText(datasBean.getType_name());  
  46.         myViewHodler.tv_prc.setText(datasBean.getPrice()+"");  
  47.         myViewHodler.tv_time.setText(datasBean.getAdd_time());  
  48.   
  49.         myViewHodler.myView.setNum(datasBean.getNum()+"");  
  50.   
  51.         //对勾选进行点击事件  
  52.         myViewHodler.gx.setOnClickListener(new View.OnClickListener() {  
  53.             @Override  
  54.             public void onClick(View v) {  
  55.                 datasBean.setCheck(myViewHodler.gx.isChecked());  
  56.                 //计算勾选状态下的数量和价格  
  57.                 EventBus.getDefault().post(getCountandPrice());  
  58.                 //通过判断子条目的checkbox是否全部选中,来改变全选的状态  
  59.                   UpdateAllQX(isCheckAll());  
  60.                   notifyDataSetChanged();  
  61.             }  
  62.         });  
  63.         /** 
  64.          * 加的点击事件 
  65.          */  
  66.         myViewHodler.myView.addClickListener(new View.OnClickListener() {  
  67.             @Override  
  68.             public void onClick(View v) {  
  69.                 int num = myViewHodler.myView.getNum();  
  70.                 ++num;  
  71.                 datasBean.setNum(num);  
  72.                 myViewHodler.myView.setNum(num+"");  
  73.                 if(myViewHodler.gx.isChecked()){  
  74.                     EventBus.getDefault().post(getCountandPrice());  
  75.                 }  
  76.   
  77.               notifyDataSetChanged();  
  78.             }  
  79.         });  
  80.         /*** 
  81.          * 减的点击事件 
  82.          */  
  83.           myViewHodler.myView.jianClickListener(new View.OnClickListener() {  
  84.             @Override  
  85.             public void onClick(View v) {  
  86.                 int num = myViewHodler.myView.getNum();  
  87.                 if(num==0){  
  88.                     return;  
  89.                 }  
  90.                 num--;  
  91.                 datasBean.setNum(num);  
  92.                 myViewHodler.myView.setNum(num+"");  
  93.                 if(myViewHodler.gx.isChecked()){  
  94.                     EventBus.getDefault().post(getCountandPrice());  
  95.                 }  
  96.   
  97.                 notifyDataSetChanged();  
  98.             }  
  99.         });  
  100.         /** 
  101.          * 点击删除事假 
  102.          */  
  103.         myViewHodler.myView.delClickListener(new View.OnClickListener() {  
  104.             @Override  
  105.             public void onClick(View v) {  
  106.                 list.remove(position);  
  107.                 if(myViewHodler.gx.isChecked()){  
  108.   
  109.                     EventBus.getDefault().post(getCountandPrice());  
  110.                 }  
  111.                 notifyDataSetChanged();  
  112.             }  
  113.         });  
  114.     }  
  115.   
  116.     @Override  
  117.     public int getItemCount() {  
  118.         return list.size();  
  119.     }  
  120.     class MyViewHodler extends RecyclerView.ViewHolder{  
  121.   
  122.         private final CheckBox gx;  
  123.         private final TextView tv_time;  
  124.         private final TextView tv_prc;  
  125.         private final TextView tv_name;  
  126.         private final MyView myView;  
  127.   
  128.         public MyViewHodler(View itemView) {  
  129.             super(itemView);  
  130.             gx = itemView.findViewById(R.id.gx);  
  131.             tv_time = itemView.findViewById(R.id.time);  
  132.             tv_prc = itemView.findViewById(price);  
  133.             tv_name = itemView.findViewById(R.id.name2);  
  134.             myView = itemView.findViewById(R.id.myView);  
  135.   
  136.         }  
  137.     }  
  138.   
  139.     /** 
  140.      * 判断子条目的checkbox是否全部选中 
  141.      * @return 
  142.      */  
  143.     private boolean isCheckAll(){  
  144.         for (int i = 0; i <list.size(); i++) {  
  145.             GoodsBean.DataBean.DatasBean datasBean = list.get(i);  
  146.          if(!datasBean.isCheck()){  
  147.              return false;  
  148.          }  
  149.   
  150.         }  
  151.         return true;  
  152.     }  
  153.     /** 
  154.      * 改变全选的状态 
  155.      */  
  156.     private void UpdateAllQX(boolean flag){  
  157.         MessageEvent messageEvent = new MessageEvent();  
  158.         messageEvent.setCheck(flag);  
  159.        EventBus.getDefault().post(messageEvent);  
  160.     }  
  161.     /** 
  162.      * 计算勾选状态下的数量和价格 
  163.      */  
  164.     private CountPrice getCountandPrice(){  
  165.         int count=0;  
  166.         int price=0;  
  167.         for (int i = 0; i <list.size(); i++) {  
  168.             GoodsBean.DataBean.DatasBean datasBean = list.get(i);  
  169.             if(datasBean.isCheck()){  
  170.                 count+=datasBean.getNum();  
  171.                 price+=datasBean.getPrice()*datasBean.getNum();  
  172.             }  
  173.   
  174.         }  
  175.         CountPrice countPrice = new CountPrice();  
  176.         countPrice.setCount(count);  
  177.         countPrice.setPrice(price);  
  178.   
  179.         return countPrice;  
  180.     }  
  181.     /** 
  182.      * 全选时改变所有的CheckBox都为选中的状态 
  183.      */  
  184.     public void UpdateAllCheck(boolean flag){  
  185.         for (int i = 0; i <list.size(); i++) {  
  186.             GoodsBean.DataBean.DatasBean datasBean = list.get(i);  
  187.              datasBean.setCheck(flag);  
  188.         }  
  189.         EventBus.getDefault().post(getCountandPrice());  
  190.         notifyDataSetChanged();  
  191.     }  
  192. }  

猜你喜欢

转载自blog.csdn.net/jun_tong/article/details/80752270