用base封装的mvp实现分类一面
2018-10-24 20:32
127 查看
依赖
implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' implementation 'com.android.support:recyclerview-v7:27.1.1' implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:converter-gson:2.3.0' implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0' implementation 'com.squareup.okhttp3:okhttp:3.11.0' implementation 'io.reactivex:rxjava:1.0.14' implementation 'io.reactivex:rxandroid:1.0.1' implementation 'com.facebook.fresco:fresco:0.12.0' implementation 'com.hyman:flowlayout-lib:1.1.2' implementation 'com.facebook.fresco:fresco:0.12.0' implementation 'com.github.bumptech.glide:glide:4.8.0'
权限
<uses-permission android:name="android.permission.INTERNET"/>
Api接口
package com.example.asus.lianxi1022.model.api; public interface Api { String GETURL="http://www.zhaoapi.cn/"; }
ApiService接口
package com.example.asus.lianxi1022.model.api; import com.example.asus.lianxi1022.model.bean.YouBean; import com.example.asus.lianxi1022.model.bean.ZuoBean; import retrofit2.http.FormUrlEncoded; import retrofit2.http.GET; import retrofit2.http.POST; import retrofit2.http.Query; import rx.Observable; public interface ApiService { @GET("product/getCatagory") Observable<ZuoBean> getzuo(); @GET("product/getProductCatagory") Observable<YouBean> getyou(@Query("cid") String cid); }
YouBean类
package com.example.asus.lianxi1022.model.bean; import java.util.List; public class YouBean { /** * msg : 获取子分类成功 * code : 0 * data : [{"cid":"1","list":[{"icon":"http://120.27.23.105/images/icon.png","name":"月饼","pcid":1,"pscid":1},{"icon":"http://120.27.23.105/images/icon.png","name":"坚果炒货","pcid":1,"pscid":2},{"icon":"http://120.27.23.105/images/icon.png","name":"糖巧","pcid":1,"pscid":3},{"icon":"http://120.27.23.105/images/icon.png","name":"休闲零食","pcid":1,"pscid":4},{"icon":"http://120.27.23.105/images/icon.png","name":"肉干肉脯","pcid":1,"pscid":5},{"icon":"http://120.27.23.105/images/icon.png","name":"饼干蛋糕","pcid":1,"pscid":6},{"icon":"http://120.27.23.105/images/icon.png","name":"蜜饯果干","pcid":1,"pscid":7},{"icon":"http://120.27.23.105/images/icon.png","name":"无糖食品","pcid":1,"pscid":8}],"name":"休闲零食","pcid":"1"},{"cid":"1","list":[{"icon":"http://120.27.23.105/images/icon.png","name":"新鲜水果","pcid":2,"pscid":9},{"icon":"http://120.27.23.105/images/icon.png","name":"海鲜水产","pcid":2,"pscid":10},{"icon":"http://120.27.23.105/images/icon.png","name":"精选肉类","pcid":2,"pscid":11},{"icon":"http://120.27.23.105/images/icon.png","name":"蛋类","pcid":2,"pscid":12},{"icon":"http://120.27.23.105/images/icon.png","name":"新鲜蔬菜","pcid":2,"pscid":13},{"icon":"http://120.27.23.105/images/icon.png","name":"冷冻食品","pcid":2,"pscid":14},{"icon":"http://120.27.23.105/images/icon.png","name":"饮品甜品","pcid":2,"pscid":15},{"icon":"http://120.27.23.105/images/icon.png","name":"大闸蟹","pcid":2,"pscid":16}],"name":"京东生鲜","pcid":"2"},{"cid":"1","list":[{"icon":"http://120.27.23.105/images/icon.png","name":"大米","pcid":3,"pscid":21},{"icon":"http://120.27.23.105/images/icon.png","name":"面粉","pcid":3,"pscid":22},{"icon":"http://120.27.23.105/images/icon.png","name":"杂粮","pcid":3,"pscid":23},{"icon":"http://120.27.23.105/images/icon.png","name":"食用油","pcid":3,"pscid":24},{"icon":"http://120.27.23.105/images/icon.png","name":"调味品","pcid":3,"pscid":25},{"icon":"http://120.27.23.105/images/icon.png","name":"方便速食","pcid":3,"pscid":26},{"icon":"http://120.27.23.105/images/icon.png","name":"有机食品","pcid":3,"pscid":27}],"name":"粮油调味","pcid":"3"},{"cid":"1","list":[{"icon":"http://120.27.23.105/images/icon.png","name":"饮用水","pcid":4,"pscid":28},{"icon":"http://120.27.23.105/images/icon.png","name":"饮料","pcid":4,"pscid":29},{"icon":"http://120.27.23.105/images/icon.png","name":"牛奶乳品","pcid":4,"pscid":30},{"icon":"http://120.27.23.105/images/icon.png","name":"名茶","pcid":4,"pscid":31},{"icon":"http://120.27.23.105/images/icon.png","name":"蜂蜜","pcid":4,"pscid":32}],"name":"水饮茗茶","pcid":"4"},{"cid":"1","list":[{"icon":"http://120.27.23.105/images/icon.png","name":"白酒","pcid":5,"pscid":33},{"icon":"http://120.27.23.105/images/icon.png","name":"葡萄酒","pcid":5,"pscid":34},{"icon":"http://120.27.23.105/images/icon.png","name":"洋酒","pcid":5,"pscid":35},{"icon":"http://120.27.23.105/images/icon.png","name":"啤酒","pcid":5,"pscid":36},{"icon":"http://120.27.23.105/images/icon.png","name":"黄酒","pcid":5,"pscid":37},{"icon":"http://120.27.23.105/images/icon.png","name":"陈年老酒","pcid":5,"pscid":38}],"name":"中外名酒","pcid":"5"}] */ private String msg; private String code; private List<DataBean> data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { /** * cid : 1 * list : [{"icon":"http://120.27.23.105/images/icon.png","name":"月饼","pcid":1,"pscid":1},{"icon":"http://120.27.23.105/images/icon.png","name":"坚果炒货","pcid":1,"pscid":2},{"icon":"http://120.27.23.105/images/icon.png","name":"糖巧","pcid":1,"pscid":3},{"icon":"http://120.27.23.105/images/icon.png","name":"休闲零食","pcid":1,"pscid":4},{"icon":"http://120.27.23.105/images/icon.png","name":"肉干肉脯","pcid":1,"pscid":5},{"icon":"http://120.27.23.105/images/icon.png","name":"饼干蛋糕","pcid":1,"pscid":6},{"icon":"http://120.27.23.105/images/icon.png","name":"蜜饯果干","pcid":1,"pscid":7},{"icon":"http://120.27.23.105/images/icon.png","name":"无糖食品","pcid":1,"pscid":8}] * name : 休闲零食 * pcid : 1 */ private String cid; private String name; private String pcid; private List<ListBean> list; public String getCid() { return cid; } public void setCid(String cid) { this.cid = cid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPcid() { return pcid; } public void setPcid(String pcid) { this.pcid = pcid; } public List<ListBean> getList() { return list; } public void setList(List<ListBean> list) { this.list = list; } public static class ListBean { /** * icon : http://120.27.23.105/images/icon.png * name : 月饼 * pcid : 1 * pscid : 1 */ private String icon; private String name; private int pcid; private int pscid; public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPcid() { return pcid; } public void setPcid(int pcid) { this.pcid = pcid; } public int getPscid() { return pscid; } public void setPscid(int pscid) { this.pscid = pscid; } } } }
ZuoBean类
package com.example.asus.lianxi1022.model.bean; import java.util.List; public class ZuoBean { /** * msg : * code : 0 * data : [{"cid":1,"createtime":"2017-10-10T19:41:39","icon":"http://120.27.23.105/images/category/shop.png","ishome":1,"name":"京东超市"},{"cid":2,"createtime":"2017-10-10T19:41:39","icon":"http://120.27.23.105/images/category/qqg.png","ishome":1,"name":"全球购"},{"cid":3,"createtime":"2017-10-10T19:45:11","icon":"http://120.27.23.105/images/category/phone.png","ishome":1,"name":"手机数码"},{"cid":5,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/man.png","ishome":1,"name":"男装"},{"cid":6,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/girl.png","ishome":1,"name":"女装"},{"cid":7,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/manshoe.png","ishome":1,"name":"男鞋"},{"cid":8,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/girlshoe.png","ishome":1,"name":"女鞋"},{"cid":9,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/shirt.png","ishome":1,"name":"内衣配饰"},{"cid":10,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/bag.png","ishome":1,"name":"箱包手袋"},{"cid":11,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/beauty.png","ishome":1,"name":"美妆个护"},{"cid":12,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/jewel.png","ishome":1,"name":"钟表珠宝"},{"cid":13,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/luxury.png","ishome":1,"name":"奢侈品"},{"cid":14,"createtime":"2017-10-10T20:12:03","icon":"http://120.27.23.105/images/category/computer.png","ishome":1,"name":"电脑办公"},{"cid":15,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"家用电器"},{"cid":16,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"食品生鲜"},{"cid":17,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":" 20000 酒水饮料"},{"cid":18,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"母婴童装"},{"cid":19,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"玩具乐器"},{"cid":20,"createtime":"2017-09-29T10:13:48","icon":"http://120.27.23.105/images/icon.png","ishome":0,"name":"医药保健"}] */ private String msg; private String code; private List<DataBean> data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { /** * cid : 1 * createtime : 2017-10-10T19:41:39 * icon : http://120.27.23.105/images/category/shop.png * ishome : 1 * name : 京东超市 */ private int cid; private String createtime; private String icon; private int ishome; private String name; public int getCid() { return cid; } public void setCid(int cid) { this.cid = cid; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public int getIshome() { return ishome; } public void setIshome(int ishome) { this.ishome = ishome; } public String getName() { return name; } public void setName(String name) { this.name = name; } } }
ModelImpl类
package com.example.asus.lianxi1022.model.modelimpl; import com.example.asus.lianxi1022.model.bean.YouBean; import com.example.asus.lianxi1022.model.bean.ZuoBean; import com.example.asus.lianxi1022.model.util.OkHttpUtil; import java.util.List; import rx.Observer; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public class ModelImpl { public interface onCallBackLintener { void resposeData(List<ZuoBean.DataBean> data); } public void zuodata(final onCallBackLintener onCallBackLintener) { OkHttpUtil.getInstance().apiService.getzuo() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<ZuoBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(ZuoBean zuoBean) { List<ZuoBean.DataBean> data = zuoBean.getData(); onCallBackLintener.resposeData(data); } }); } public interface onCallBackchild { void resposeyou(List<YouBean.DataBean> data); } public void youdata(int cid, final onCallBackchild onCallBackchild) { // String cid2 = String.valueOf(cid); OkHttpUtil.getInstance().apiService.getyou(cid+"") .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<YouBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(YouBean youBean) { List<YouBean.DataBean> data = youBean.getData(); onCallBackchild.resposeyou(data); } }); } }
baseModel类
package com.example.asus.lianxi1022.model.modelimpl; public class BaseModel { }
OkHttp类
package com.example.asus.lianxi1022.model.util; import com.example.asus.lianxi1022.model.api.Api; import com.example.asus.lianxi1022.model.api.ApiService; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; public class OkHttpUtil { private static final OkHttpUtil ourInstance = new OkHttpUtil(); public ApiService apiService; public static OkHttpUtil getInstance() { return ourInstance; } private OkHttpUtil() { Retrofit retrofit = new Retrofit.Builder() .baseUrl(Api.GETURL) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(); apiService = retrofit.create(ApiService.class); } }
MainPresenter类
package com.example.asus.lianxi1022.presenter; import com.example.asus.lianxi1022.model.bean.YouBean; import com.example.asus.lianxi1022.model.bean.ZuoBean; import com.example.asus.lianxi1022.model.modelimpl.ModelImpl; import java.util.List; public class MainPresenter extends BasePresenter{ private final ModelImpl model; public MainPresenter() { model = new ModelImpl(); } public void getinfodata() { model.zuodata(new ModelImpl.onCallBackLintener() { @Override public void resposeData(List<ZuoBean.DataBean> data) { iView.onsuccess(data); } }); } public void getchilddata(int cid) { model.youdata( cid ,new ModelImpl.onCallBackchild(){ @Override public void resposeyou(List<YouBean.DataBean> data) { iView.onsuccesschild(data); } }); } }
BasePresenter类
package com.example.asus.lianxi1022.presenter; import com.example.asus.lianxi1022.view.iView.IBaseView; import com.example.asus.lianxi1022.view.iView.IMainView; public class BasePresenter <IView extends IMainView> { IView iView; public void attch(IView iView){ this.iView=iView; } public void delech(){ this.iView=null; } public IView getiView(){ return iView; } }
MainActivity类
package com.example.asus.lianxi1022.view.activity; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import com.example.asus.lianxi1022.R; import com.example.asus.lianxi1022.model.bean.YouBean; import com.example.asus.lianxi1022.model.bean.ZuoBean; import com.example.asus.lianxi1022.presenter.MainPresenter; import com.example.asus.lianxi1022.view.adapter.YouAdapter; import com.example.asus.lianxi1022.view.adapter.ZuoAdapter; import com.example.asus.lianxi1022.view.iView.IMainView; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; public class MainActivity extends AppCompatActivity implements IMainView { @BindView(R.id.zuo_recycler) RecyclerView zuoRecycler; @BindView(R.id.you_recycler) RecyclerView youRecycler; private MainPresenter mainPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); mainPresenter = new MainPresenter(); mainPresenter.attch(this); mainPresenter.getinfodata(); } @Override public void onsuccess(final List<ZuoBean.DataBean> zuo) { LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); zuoRecycler.setLayoutManager(linearLayoutManager); ZuoAdapter zuoAdapter= new ZuoAdapter(zuo, MainActivity.this); zuoRecycler.setAdapter(zuoAdapter); zuoAdapter.setOnitmeclickLinsenter(new ZuoAdapter.onitmeclickLinsenter() { @Override public void onclick(int position) { //Toast.makeText(MainActivity.this, "第"+position, Toast.LENGTH_SHORT).show(); int cid = zuo.get(position).getCid(); mainPresenter.getchilddata(cid); } }); } @Override public void onsuccesschild(List<YouBean.DataBean> you) { youRecycler.setLayoutManager(new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false)); YouAdapter adapter=new YouAdapter(you,MainActivity.this); youRecycler.setAdapter(adapter); } @Override protected void onDestroy() { super.onDestroy(); mainPresenter.delech(); } }
FenneibuAdapter类
package com.example.asus.lianxi1022.view.adapter; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.example.asus.lianxi1022.R; import com.example.asus.lianxi1022.model.bean.YouBean; import java.util.List; public class FenneibuAdapter extends RecyclerView.Adapter<FenneibuAdapter.FenHodel> { List<YouBean.DataBean.ListBean> list; Context context; public FenneibuAdapter(List<YouBean.DataBean.ListBean> list, Context context) { this.list = list; this.context = context; } @NonNull @Override public FenHodel onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.show, parent, false); FenHodel fenHodel = new FenHodel(view); return fenHodel; } @Override public void onBindViewHolder(@NonNull FenHodel holder, int position) { String icon = list.get(position).getIcon(); Glide.with(context).load(icon).into(holder.imag2) ; holder.textView.setText(list.get(position).getName()); } @Override public int getItemCount() { return list.size(); } class FenHodel extends RecyclerView.ViewHolder { private ImageView imag2; private TextView textView; public FenHodel(View itemView) { super(itemView); imag2 = itemView.findViewById(R.id.fen_imag); textView = itemView.findViewById(R.id.fen_text); } } }
YouAdapter类
package com.example.asus.lianxi1022.view.adapter; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.example.asus.lianxi1022.R; import com.example.asus.lianxi1022.model.bean.YouBean; import java.util.List; public class YouAdapter extends RecyclerView.Adapter<YouAdapter.MyHodel> { List<YouBean.DataBean> you; Context context; public YouAdapter(List<YouBean.DataBean> you, Context context) { this.you = you; this.context = context; } @NonNull @Override public MyHodel onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.youitme, parent, false); MyHodel myHodel = new MyHodel(view); return myHodel; } @Override public void onBindViewHolder(@NonNull MyHodel holder, int position) { List<YouBean.DataBean.ListBean> list = you.get(position).getList(); holder.you_itme.setText(you.get(position).getName()); holder.recyclerView.setLayoutManager(new GridLayoutManager(context, 3)); holder.recyclerView.setAdapter(new FenneibuAdapter(list, context)); } @Override public int getItemCount() { return you.size(); } class MyHodel extends RecyclerView.ViewHolder { private TextView you_itme; private RecyclerView recyclerView; public MyHodel(View itemView) { super(itemView); you_itme = itemView.findViewById(R.id.you_itme); recyclerView = itemView.findViewById(R.id.you_recyclerview); } } }
zuoAdapter类
package com.example.asus.lianxi1022.view.adapter; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.text.Layout; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.example.asus.lianxi1022.R; import com.example.asus.lianxi1022.model.bean.ZuoBean; import java.util.List; public class ZuoAdapter extends RecyclerView.Adapter<ZuoAdapter.MyHoldel> { List<ZuoBean.DataBean> zuo; Context context; public ZuoAdapter(List<ZuoBean.DataBean> zuo, Context context) { this.zuo = zuo; this.context = context; } @NonNull @Override public MyHoldel onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.zuoitme, parent, false); MyHoldel myHoldel = new MyHoldel(view); return myHoldel; } @Override public void onBindViewHolder(@NonNull MyHoldel holder, int position) { holder.text1.setText(zuo.get(position).getName()); } @Override public int getItemCount() { return zuo.size(); } class MyHoldel extends RecyclerView.ViewHolder implements View.OnClickListener { private final TextView text1; public MyHoldel(View itemView) { super(itemView); text1 = itemView.findViewById(R.id.zuo_text1); itemView.setOnClickListener(this); } @Override public void onClick(View view) { if (itemView != null) { int layoutPosition = getLayoutPosition(); onitmeclickLinsenter.onclick(layoutPosition); } } } onitmeclickLinsenter onitmeclickLinsenter; public interface onitmeclickLinsenter { void onclick(int position); } public void setOnitmeclickLinsenter(ZuoAdapter.onitmeclickLinsenter onitmeclickLinsenter) { this.onitmeclickLinsenter = onitmeclickLinsenter; } }
IBaseView接口
package com.example.asus.lianxi1022.view.iView; public interface IBaseView { }
IMainView接口
package com.example.asus.lianxi1022.view.iView; import com.example.asus.lianxi1022.model.bean.YouBean; import com.example.asus.lianxi1022.model.bean.ZuoBean; import java.util.List; public interface IMainView extends IBaseView{ void onsuccess(List<ZuoBean.DataBean> zuo); void onsuccesschild(List<YouBean.DataBean> you); }
阅读更多
相关文章推荐
- 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?
- iOS开发之资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0+)
- Android -- 带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(三)
- 使用MVP,OKHttp封装类及其拦截器,RecyclerView,SpringView,ImageLoader实现数据的多条目加载
- 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?
- 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?
- Android如何从实现到封装一个MVP详解
- 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?
- Android AndBase框架内部封装实现进度框、Toast框、弹出框、确认框(二)
- Android 学习笔记之AndBase框架学习(四) 使用封装好的函数实现单,多线程任务
- 封装MVP 实现登录注册功能
- 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?
- 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?
- OKhttp+Retrofit的封装加单例模式MVP实现
- 终极封装 Rxjava+Retrofit+okhttp+mvp实现
- MVP实现购物车(二级列表),删除结算功能,拦截器+封装okHttp
- MVP+Retrofit+RxJava实现分类
- 仿京东APP分类页面(mvp模式+OkHttp封装工具类+拦截器+弱引用回收)
- Android封装MVP实现登录注册功能
- 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?