//配置清单文件
< uses-permission android :name = “android.permission.INTERNET” />--------
< activity android :name = “.view.MainActivity” > </ activity > < activity android :name = “.view.SplashActivity” > < intent-filter > < action android :name = “ android.intent.action.MAIN“ /> < category android :name = ”android.intent.category.LAUNCHER“ /> </ intent-filter > </ activity >
------------- ------------------------------------------
//依赖
编译'com.squareup.okhttp3:okhttp:3.3.0' 编译'com.google.code.gson:GSON:2.2.4' 编译'com.squareup.okio:奥基奥:1.5.0' 编译“com.github。 bumptech.glide:滑行:3.6.1' -------------------------------------------------- --- \ utils的层
公共类 HttpConfig { 公共静态字符串detail_url = “https://www.zhaoapi.cn/product/getProductDetail” ; public static String add_url = “https://www.zhaoapi.cn/product/addCart” ; public static String cartList_url = “https://www.zhaoapi.cn/product/getCarts” ; }-------------------------------------------------- -----
公共类 OkHttpUtils { 私有静态 OkHttpUtils okHttpUtils = null ; 私人 MyHandler myHandler = 新的 MyHandler(); 私人 OkLoadListener okLoadListener ; //单例 public static OkHttpUtils getInstance(){ if(okHttpUtils == null){ okHttpUtils = new OkHttpUtils(); } 返回okHttpUtils ; } / /获取 公共无效 OKGet(字符串网址){ OkHttpClient client = new OkHttpClient.Builder()。addInterceptor(new MyInter())。build(); Request request = new Request.Builder()。url(url).build(); Call call = client.newCall(request); call.enqueue(new Callback(){ @ Override public void onFailure(Call call,IOException e){ Message message = myHandler .obtainMessage(); 信息。什么 = 0 ; 信息。obj = e.getMessage(); myHandler .sendMessage(message); } @覆盖 公共无效 onResponse(电话呼叫,应答响应)抛出 IOException异常{ Message message = myHandler .obtainMessage(); 信息。什么 = 1 ; 信息。obj = response.body()。string(); myHandler .sendMessage(message); } }); } // post public void okPost(String url,Map <String,String> map){ OkHttpClient client = new OkHttpClient.Builder()。addInterceptor(new MyInter())。build(); //创建FormBody FormBody.Builder builder = new FormBody.Builder(); //遍历映射 Set <String> keys = map.keySet(); for(String key:keys){ String value = map.get(key); builder.add(key,value + “”); } // build FormBody body = builder.build(); Request request = new Request.Builder()。url(url).post(body).build(); Call call = client.newCall(request); call.enqueue(new Callback(){ @ Override public void onFailure(Call call,IOException e){ Message message = myHandler .obtainMessage(); 信息。什么 = 0 ; 信息。obj = e.getMessage(); myHandler .sendMessage(message); } @覆盖 公共无效 onResponse(电话呼叫,应答响应)抛出 IOException异常{ Message message = myHandler .obtainMessage(); 信息。什么 = 1 ; 信息。obj = response.body()。string(); myHandler .sendMessage(message); } }); } //拦截器 类 MyInter 实现了 Interceptor { private static final String TAG = “MyInter” ; @Override public response intercept(Chain chain)throws IOException { //获取原来的主体 Request request = chain.request(); RequestBody body = request.body(); if(body instanceof FormBody){ //遍历原来的所有参数,加到新的Body里面,最后将公共参数加到新的Body FormBody.Builder newBuilder = new FormBody.Builder(); for(int i = 0 ; i <((FormBody)body).size(); i ++){ String name =((FormBody)body).name(i); String value =((FormBody)body).value(i); //放入新的 newBuilder.add(name,value); } //在将公共参数添加 进去newBuilder.add(“source”,“android”); FormBody newBody = newBuilder.build(); //创建新的请求 请求newRequest = request.newBuilder()。post(newBody).build(); 响应响应= chain.proceed(newRequest); 回复回复; } 返回null ; } } //处理程序 类 MyHandler的延伸处理程序{ @覆盖 公共无效的handleMessage(消息MSG){ 开关(MSG。什么){ 情况下0: //失败 串E =(字符串)味精。obj ; okLoadListener .okLoadError(e); 打破 ; 情况1: //成功 字符串json =(字符串)味精。obj ; okLoadListener .okLoadSuccess(JSON); 打破 ; } } } //提高外部调用的接口 public void setOkLoadListener(OkLoadListener okLoadListener){ this。okLoadListener = okLoadListener; } }-------------------------------------------------- ---------
公共接口 OkLoadListener { //网络请求成功 void okLoadSuccess(String json); //网络请求失败 void okLoadError(String error); }
-------------------------------------------------- -----
公共接口 AddCartListener { //添加成功 void addCartSuccecc(String json); //添加失败 void addCartError(String json); }-------------------------------------------------- -------
公共接口 CartListLoadListener { void cartLoadSuccess(String json); void cartLoadError(String error); }-------------------------------------------------- ----
public interface DetailLoadListener { void detailLoadSuccess(String json); void detailLoadError(String json); }-------------------------------------------------- -----
public interface Imodel { //详细页 void getDetailData(String url,Map <String,String> map,DetailLoadListener detailLoadListener); //添加购物车 void addToCart(String url,Map <String,String> map,AddCartListener addCartListener); //查询数据 void showDataToCart(String url,Map <String,String> map,CartListLoadListener cartListLoadListener); //计算总价 double countAll(CartBean cartBean); }* ------------------------------------------------- -----
公共类 ModelImpl 实现 Imodel { @覆盖 公共无效 getDetailData(字符串URL,地图<字符串,字符串>地图,最终 DetailLoadListener detailLoadListener){ OkHttpUtils实例= OkHttpUtils。getInstance(); instance.okPost(URL,地图); instance.setOkLoadListener(新 OkLoadListener(){ @覆盖 公共无效 okLoadSuccess(字符串JSON){ //Log.d( “请求数据”,JSON); detailLoadListener .detailLoadSuccess(JSON); } @覆盖 公共无效 okLoadError(字符串错误){ detailLoadListener .detailLoadError(误差); } }); } @Override public void addToCart(String url,Map <String,String> map,final AddCartListener addCartListener){ OkHttpUtils实例= OkHttpUtils。getInstance(); instance.okPost(URL,地图); 实例.setOkLoadListener (新的 OkLoadListener(){ @ Override 公共无效 okLoadSuccess(字符串JSON){ addCartListener .addCartSuccecc(JSON); } @覆盖 公共无效 okLoadError(字符串错误){ addCartListener .addCartError(误差); } }); } @Override public void showDataToCart(String url,Map <String,String> map,final CartListLoadListener cartListLoadListener){ OkHttpUtils实例= OkHttpUtils。getInstance(); instance.okPost(URL,地图); 实例.setOkLoadListener (新的 OkLoadListener(){ @ Override 公共无效 okLoadSuccess(字符串JSON){ cartListLoadListener .cartLoadSuccess(JSON); } @覆盖 公共无效 okLoadError(字符串错误){ cartListLoadListener .cartLoadError(误差); } }); } @覆盖 公共双 countAll(CartBean cartBean){ INT NUM = 0 ; List <CartBean.DataBean> data = cartBean.getData(); for(int i = 0 ; i <data.size(); i ++){ List <CartBean.DataBean.ListBean> list = data.get(i).getList(); for(int j = 0 ; j <list.size(); j ++){ if(list.get(j).getChildflag()){ double gbp = list.get(j).getPrice(); NUM + = GBP; } } } 返回数字; } }-------------------------------------------------- --------------------
Prosenter层
公共接口IProsenter { //详情页 void showDetailToData(Imodel imodel,IMainView iMainView); //添加购物车 void addToCart(Imodel imodel,IMainView iMainView); //购物车数据 void showDataToCart(Context context,Imodel imodel,ICartView iCartView); void countAll(Imodel imodel,ICartView iCartView,CartBean cartBean); }-------------------------------------------------- --------------------
public class PreSenterImpl implements IProsenter { private static final String TAG = “PreSenterImpl” ; @Override public void showDetailToData(Imodel imodel,final IMainView iMainView){ // Log.d(“请求数据”,“走没走”); Map <String,String> map = new HashMap <String,String>(); map.put(“pid”,“71”); imodel.getDetailData(HttpConfig。detail_url,地图,新 DetailLoadListener(){ @覆盖 公共无效 detailLoadSuccess(JSON字符串){ 日志。d(“请求数据----”,json); Gson gson = new Gson(); DetailBean豆= gson.fromJson(JSON,DetailBean。类); iMainView .showDetailData(bean); } @覆盖 公共无效 detailLoadError(字符串JSON){ 日志。d(TAG,“失败”); } }); } @Override public void addToCart(Imodel imodel,final IMainView iMainView){ Map <String,String> map = new HashMap <String,String>(); map.put(“pid”,iMainView.getPid()); map.put(“uid”,“71”); imodel.addToCart(HttpConfig。add_url,地图,新 AddCartListener(){ @覆盖 公共无效 addCartSuccecc(JSON字符串){ 尝试 { JSONObject obj = new JSONObject(json); String code = obj.getString(“code”); if(code.equals(“0”)){ iMainView .showAddSuccsee(json); 日志。d(TAG,“添加数据成功”); } 其他 { iMainView .showAddError(json); 日志。d(TAG,“添加数据失败”); } } 捕获(JSONException E){ e.printStackTrace(); } } @覆盖 公共无效 addCartError(字符串JSON){ iMainView .showAddError(JSON); } }); } @Override public void showDataToCart(final Context context,Imodel imodel,final ICartView iCartView){ Map <String,String> map = new HashMap <String,String>(); map.put(“uid”,“71”); imodel.showDataToCart(HttpConfig。cartList_url,地图,新 CartListLoadListener(){ @覆盖 公共无效 cartLoadSuccess(JSON字符串){ Gson gson = new Gson(); CartBean购物= gson.fromJson(JSON,CartBean。类); 日志。d(“显示数据”,cart.toString()); iCartView .showDataToCart(context,cart); } @覆盖 公共无效 cartLoadError(字符串错误){ } }); } @覆盖 公共无效 countAll(Imodel imodel,ICartView iCartView,CartBean cartBean){ 双所有= imodel.countAll(cartBean); 日志。d(“总价格”,all + “”); iCartView.showNum(全部); } }-------------------------------------------------- --------------------------------
//查看层
public class AnimatorUtils { public static AnimatorSet setAnimatorSet(Context context,View view){ //获取屏幕宽度的一半属性动画 int pixels = context.getResources()。getDisplayMetrics()。高度像素 ; ObjectAnimator翻译Y = ObjectAnimator。ofFloat(view,“translationY”,0,pixels / 2); ObjectAnimator scaleX = ObjectAnimator。ofFloat(view,“scaleX”,2.0f,1.0f); ObjectAnimator scaleY = ObjectAnimator。ofFloat(view,“scaleY”,2.0f,1.0f); ObjectAnimator alpha = ObjectAnimator。ofFloat(视图,“阿尔法”,0,1.0F); ObjectAnimator旋转= ObjectAnimator。ofFloat(视图,“旋转”,0,360); AnimatorSet set = new AnimatorSet(); set.playTogether(translationY,将scaleX,的scaleY,α,旋转); set.setDuration(3000); set.start(); 回报集; } }-------------------------------------------------- -----------------------------------------
公共类 SplashActivity 扩展 AppCompatActivity { 私人 ImageView img ; @Override 保护无效的 onCreate(Bundle savedInstanceState){ 超级 .onCreate(savedInstanceState); 的setContentView(R.layout activity_splash); initViews(); } private void initViews(){ img =(ImageView)findViewById(R.id。splash_img); AnimatorSet set = AnimatorUtils。setAnimatorSet(SplashActivity。此,IMG); set.addListener(new AnimatorListenerAdapter(){ @ Override public void onAnimationEnd(Animator animation){ super .onAnimationEnd(animation); startActivity(新的意向书(SplashActivity。这,MainActivity。类)); //加跳转动画 overridePendingTransition(R.anim。输入,R.anim。出来); //结束本页面 光洁度(); } }); } }-------------------------------------------------- --------------------------------------------
公共接口 ICartView { void showDataToCart(Context context,CartBean cartBean); void showNum(double num); CartBean getCartBean(); }
-------------------------------------------------- -----------------------------------------
公共类 CartActivity 扩展 AppCompatActivity 实现 ICartView { private ExpandableListView exp ; 私人 CheckBox 框 ; 私人 TextView priceAll ; 私人 CartBean cartBean ; 私人 MyAdapter myAdapter ; @Override 保护无效的 onCreate(Bundle savedInstanceState){ 超级 .onCreate(savedInstanceState); 的setContentView(R.layout activity_cart); initViews(); PreSenterImpl preSenter = new PreSenterImpl(); preSenter.showDataToCart(this,new ModelImpl(),this); } private void initViews(){ exp =(ExpandableListView)findViewById(R.id。cart_exp); box =(CheckBox)findViewById(R.id。cart_box); priceAll =(TextView)findViewById(R.id。cart_priceAll); box .setOnClickListener(new View.OnClickListener(){ @ Override public void onClick(View v){ List <CartBean.DataBean> data = cartBean .getData(); for(int i = 0 ; i <data.size(); i ++){ data.get(I).setGroupflag(data.get(I).getGroupflag()!); List <CartBean.DataBean.ListBean> list = data.get(i).getList(); for(int j = 0 ; j <list.size(); j ++){ list.get(J).setChildflag(list.get(J).getChildflag()!); } } myAdapter .notifyDataSetChanged(); PreSenterImpl preSenter = new PreSenterImpl(); preSenter.countAll(新 ModelImpl(),CartActivity。这,cartBean); } }); } //显示数据 @Override public void showDataToCart(Context context,CartBean cartBean){ this。cartBean = cartBean; myAdapter = new MyAdapter(context,cartBean,this); exp .setAdapter(myAdapter); //展开所有的列表 int childCount = myAdapter .getGroupCount(); for(int i = 0 ; i <childCount; i ++){ exp .expandGroup(i); } } @覆盖 公共无效 showNum(双 NUM){ priceAll .setText( “ 总价:” + NUM); } @覆盖 公共 CartBean getCartBean(){ 返回cartBean ; } }-------------------------------------------------- ----------------------------
公共接口 IMainView { 无效 showDetailData(DetailBean豆); void addToCart(); String getPid(); void showAddSuccsee(String json); void showAddError(String error); }-------------------------------------------------- ------
公共类 MainActivity 扩展 AppCompatActivity 实现 IMainView { 私人 ImageView img ; 私人 TextView 名称 ; 私人 TextView 价格 ; 私人 TextView price_to ; 私人 TextView 添加 ; 私人 TextView 购物车 ; 私人 PreSenterImpl preSenter ; 私人 DetailBean 豆 ; @Override 保护无效的 onCreate(Bundle savedInstanceState){ 超级 .onCreate(savedInstanceState); 的setContentView(R.layout activity_main); initView(); preSenter = new PreSenterImpl(); preSenter .showDetailToData(new ModelImpl(),this); } private void initView(){ img =(ImageView)findViewById(R.id。main_img); name =(TextView)findViewById(R.id。main_name); price =(TextView)findViewById(R.id。main_price); price_to =(TextView)findViewById(R.id。main_priceto); add =(TextView)findViewById(R.id.main_add); cart =(TextView)findViewById(R.id.main_cart); cart .setOnClickListener(new View.OnClickListener(){ @ Override public void onClick(View v){ startActivity(新的意向书(MainActivity。这,CartActivity。类)); overridePendingTransition(R.anim 输入,R.anim。出来); 完(); } }); 添加 .setOnClickListener(新 View.OnClickListener(){ @覆盖 公共无效的onClick(视图v){ 主持人 .addToCart(新 ModelImpl(),MainActivity。此); } }); } private static final String TAG = “MainActivity” ; @Override public void showDetailData(DetailBean bean){ this。bean = bean; 日志。d(TAG,“--- shuju ====” + bean); String images = bean.getData()。getImages(); String image = images.split(“.jpg”)[ 0 ] + “.jpg” ; 滑行。与(MainActivity。此).load(图像).into(IMG); name .setText(bean.getData()。getTitle()); price .setText(“原价:” + bean.getData()。getPrice()); price_to .setText(“折扣价” + bean.getData()。getBargainPrice()); } @Override public void addToCart(){ } @Override public String getPid(){ return bean .getData()。getPid()+ “” ; } @覆盖 公共无效 showAddSuccsee(字符串JSON){ } @覆盖 公共无效 showAddError(字符串错误){ } }-------------------------------------------------- ------------------
公共类 MyAdapter 扩展 BaseExpandableListAdapter { private final上下文上下文 ; 私人终极 CartBean cartBean ; 私人最终 ICartView iCartView ; 私人最终列表<CartBean.DataBean> 列表 ; 私人 GroupViewHolder 持有人 ; 私人 ChildViewHolder holder1 ; 公共 MyAdapter(上下文上下文,CartBean cartBean,ICartView iCartView){ this。context = context; 这个。cartBean = cartBean; 这个。iCartView = iCartView; 这个。list = cartBean.getData(); } @Override public int getGroupCount(){ return list .size(); } @Override public int getChildrenCount(int groupPosition){ return list .get(groupPosition).getList()。size(); } @Override public Object getGroup(int groupPosition){ return list .get(groupPosition); } @Override public Object getChild(int groupPosition,int childPosition){ return list .get(groupPosition).getList()。get(childPosition); } @Override public long getGroupId(int groupPosition){ return groupPosition; } @Override public long getChildId(int groupPosition,int childPosition){ return childPosition; } @覆盖 公共布尔 hasStableIds(){ 返回false ; } @Override public View getGroupView(final int groupPosition,boolean isExpanded,View convertView,ViewGroup parent){ if(convertView == null){ convertView = View。膨胀(上下文。,R.layout groupitem,空); CheckBox group_box = convertView.findViewById(R.id。group_box); TextView的组名= convertView.findViewById(R.id GROUP_NAME); holder = new GroupViewHolder(group_box,group_name); convertView.setTag(持有者); } else { holder =(GroupViewHolder)convertView.getTag(); } 持有者 .getGroup_box()。setChecked(list .get(groupPosition).getGroupflag()); 持有者 .getGroup_name()。setText(list .get(groupPosition).getSellerName()); 保持器。.getGroup_box()setOnClickListener(新 View.OnClickListener(){ @覆盖 公共无效的onClick(视图v){ 布尔 isCleked = 列表获得(groupPosition).getGroupflag(); isCleked = isCleked!; list .get(groupPosition).setGroupflag(isCleked); List <CartBean.DataBean.ListBean> beans = MyAdapter。这个。list .get(groupPosition).getList(); for(int i = 0 ; i <beans.size(); i ++){ beans.get(ⅰ).setChildflag(isCleked); } notifyDataSetChanged(); PreSenterImpl preSenter = new PreSenterImpl(); preSenter.countAll(new ModelImpl(),iCartView,cartBean); } }); 返回 convertView; } @Override public View getChildView(final int groupPosition,final int childPosition,boolean isLastChild,View convertView,ViewGroup parent){ if(convertView == null){ convertView = View。膨胀(上下文。,R.layout childitem,空); CheckBox child_box = convertView.findViewById(R.id。child_box); ImageView child_img = convertView.findViewById(R.id。child_img); TextView child_subhead = convertView.findViewById(R.id。child_subhead); TextView child_price = convertView.findViewById(R.id。child_price); holder1 = 新的 ChildViewHolder(child_box,child_img,child_subhead,child_price); convertView.setTag(holder1); } else { holder1 =(ChildViewHolder)convertView.getTag(); } holder1 .getChild_box()。setChecked(list .get(groupPosition).getList()。get(childPosition).getChildflag()); String images = list .get(groupPosition).getList()。get(childPosition).getImages(); String image = images.split(“.jpg”)[ 0 ] + “.jpg” ; 日志。d(“图片”,图片); 滑行。与(上下文).load(图像).into(holder1 .getChild_img()); holder1 .getChild_subhead()。setText(list .get(groupPosition).getList()。get(childPosition).getSubhead()); holder1 .getChild_price()。setText(list .get(groupPosition).getList()。get(childPosition).getPrice()+ “”); holder1 .getChild_box()。setOnClickListener(new View.OnClickListener(){ @ Override public void onClick(View v){ boolean isCleked = list .get(groupPosition).getList()。get(childPosition).getChildflag(); isCleked = isCleked!; list .get(groupPosition).getList()。get(childPosition).setChildflag(isCleked); List <CartBean.DataBean.ListBean> beans = MyAdapter。这个。list .get(groupPosition).getList(); 布尔标志= 真 ; for(int i = 0 ; i <beans.size(); i ++){ if(!beans.get(i).getChildflag()){ flag = false ; } } list .get(groupPosition).setGroupflag(flag); notifyDataSetChanged(); PreSenterImpl preSenter = new PreSenterImpl(); preSenter.countAll(new ModelImpl(),iCartView,cartBean); } }); 返回 convertView; } @覆盖 公共布尔 isChildSelectable(INT groupPosition,INT childPosition){ 返回false ; } class GroupViewHolder { private CheckBox group_box ; 私人 TextView 组名 ; public GroupViewHolder(CheckBox group_box,TextView group_name){ this。group_box = group_box; 这个。group_name = group_name; } public CheckBox getGroup_box(){ return group_box ; } public void setGroup_box(CheckBox group_box){ this。group_box = group_box; } public TextView getGroup_name(){ return group_name ; } public void setGroup_name(TextView group_name){ this。group_name = group_name; } } class ChildViewHolder { private CheckBox child_box ; 私人 ImageView child_img ; 私人 TextView的child_subhead ; 私人 TextView的child_price ; public ChildViewHolder(CheckBox child_box,ImageView child_img,TextView child_subhead,TextView child_price){ this。child_box = child_box; 这个。child_img = child_img; 这个。child_subhead = child_subhead; 这个。child_price = child_price; } public CheckBox getChild_box(){ return child_box ; } public void setChild_box(CheckBox child_box){ this。child_box = child_box; } public ImageView getChild_img(){ return child_img ; } public void setChild_img(ImageView child_img){ this。child_img = child_img; } public TextView getChild_subhead(){ return child_subhead ; } public void setChild_subhead(TextView child_subhead){ this。child_subhead = child_subhead; } public TextView getChild_price(){ return child_price ; } public void setChild_price(TextView child_price){ this。child_price = child_price; } } }