一共分为两部分,第一部分是RxJava+Retrofit网络请求的使用,一部分是MVP模式结合网络请求

一,RxJava+Retrofit的使用

①module引入

里面已经封装了OkHttp和Gson,不需要另外引入

   implementation 'com.squareup.retrofit2:retrofit:2.3.0'implementation 'com.squareup.retrofit2:converter-gson:2.3.0'implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'implementation 'io.reactivex:rxandroid:1.2.1'

②网络层的封装

模块区分类

interface MainInter {@POST("接口地址")fun getMiddlemanData():Observable<ResponseBody>
}

开始网络请求

class Network {public val BASEURL="http://域名/"private fun getRetrofit():Retrofit = Retrofit.Builder().client(OkHttpClient()).baseUrl(BASEURL).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build()public fun manApi():MainApi=getRetrofit().create(MainApi::class.java)companion object {var netWork: Network? = nullfun getInstance():Network{if (netWork == null) {synchronized(Network::class) {if (netWork == null) {netWork = Network()}}}return netWork!!}}}

请求简单使用

Network.getInstance().manApi() .getMiddlemanData().subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe { body-> ToastUtil.show(baseContext,body.string()); }

二、Rxjava+Retrofit以及结合MVP的使用

MVP开发模式即
M层负责数据与逻辑的提供者
V层负责界面的更新
P层负责结合M层获取数据去调用V层刷新数据

interface MainView{/*** 显示轮播图*/fun showImageBanner(listData:MutableList<String>)/*** 显示文字轮播图*/fun showTextBanner(listData:MutableList<ItemBean>)/*** 显示经纪人RCY*/fun showMiddlemanData(listData:MutableList<MiddlemanBean>)/*** 显示业主房源RCY*/fun showOwnerHouseData(listData:MutableList<OwnerHouseBean>)/*** 显示公寓RCY*/fun showApartmentData(listData:MutableList<ApartmentBean>)/*** 显示公寓房源RCY*/fun showApartmentHouseData(listData:MutableList<ApartmentHouseBean>)/*** 显示无网络弹框*/fun showNoNetDialog()/*** 显示服务器异常弹框*/fun showErrorDialog(msg:String)/*** 显示加载中弹框*/fun showDialog()/*** 关闭加载中弹框*/fun dismissDialog(num:Int)/*** 显示添加弹框*/fun showAddDialog()/*** 旋转*/fun rotateAnim(type:Int)/*** 消息打印*/fun toast(msg:String)/*** 关闭刷新*/fun dismissRefresh()}

Model数据的获取(此处给的是模拟数据的回调)

package com.wocus.wine.modelimport com.google.gson.Gson
import com.wocus.wine.callback.HouseCallback
import com.wocus.wine.entity.*
import java.util.*class MainModel{/*** 请求后台图片轮播图数据*/fun getImageBannerData(callback:HouseCallback){val list = ArrayList<String>()list.add("https://bpic.588ku.com/element_banner/20/18/06/56e59bd04e1f1f35afb8a9f26fe469c2.jpg!/unsharp/true/compress/true")list.add("https://bpic.588ku.com/element_banner/20/18/06/80c88dd07b1ba5a490471cc828216a7f.jpg!/unsharp/true/compress/true")list.add("https://bpic.588ku.com/element_banner/20/18/06/fc0d878aa7fef013a80a6385ab771440.jpg!/unsharp/true/compress/true")list.add("https://bpic.588ku.com/element_banner/20/18/06/1a8011cadf7e936d6acceae8f14b7d10.jpg!/unsharp/true/compress/true")list.add("https://bpic.588ku.com/element_banner/20/18/06/5669c4f4f49355ed8ddfcebc223dd182.jpg!/unsharp/true/compress/true")list.add("https://bpic.588ku.com/element_banner/20/18/06/0317717f3a27c5d5717a42a2390bac2b.jpg!/unsharp/true/compress/true")list.add("https://bpic.588ku.com/element_banner/20/18/06/e3743fc3744fc30db419c0ca97bc9f16.jpg!/unsharp/true/compress/true")list.add("https://bpic.588ku.com/element_banner/20/18/06/c9a22ed27ff46baf9366e83af9b1bf4f.jpg!/unsharp/true/compress/true")callback.onSuccess(Gson().toJson(list))}/*** 请求后台文字轮播图数据*/fun getTextBannerData(callback: HouseCallback){val items = ArrayList<ItemBean>()val item = ItemBean()item.title = "最新"item.text = "逃离北上广之后,我们可以住哪儿?"+Date().timeitems.add(item)val item1 = ItemBean()item1.title = "HOT"item1.text = "大城市,这里没有生活,但是有钱!"items.add(item1)val item2 = ItemBean()item2.title = "HOT"item2.text = "和异性合租是种什么样的体验?"items.add(item2)val item3 = ItemBean()item3.title = "推荐"item3.text = "单身小伙把出租屋爆改成五星级公寓!"items.add(item3)callback.onSuccess(Gson().toJson(items))}/*** 请求经纪人数据*/fun getMiddlemanData(callback: HouseCallback){/* Network.getInstance().manApi().getMiddlemanData().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(consumer)*/val listData=ArrayList<MiddlemanBean>()listData.add(MiddlemanBean("https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=df67173bdab44aed4d43b6b6d275ec64/2fdda3cc7cd98d1058961840213fb80e7bec9004.jpg","张三","北京,上海,广州,深圳,梧州"))listData.add(MiddlemanBean("https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=df67173bdab44aed4d43b6b6d275ec64/2fdda3cc7cd98d1058961840213fb80e7bec9004.jpg","张三","北京,上海,广州,深圳,梧州"))listData.add(MiddlemanBean("https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=df67173bdab44aed4d43b6b6d275ec64/2fdda3cc7cd98d1058961840213fb80e7bec9004.jpg","张三","北京,上海,广州,深圳,梧州"))listData.add(MiddlemanBean("https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=df67173bdab44aed4d43b6b6d275ec64/2fdda3cc7cd98d1058961840213fb80e7bec9004.jpg","张三","北京,上海,广州,深圳,梧州"))listData.add(MiddlemanBean("https://gss1.bdstatic.com/9vo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=df67173bdab44aed4d43b6b6d275ec64/2fdda3cc7cd98d1058961840213fb80e7bec9004.jpg","张三","北京,上海,广州,深圳,梧州"))callback.onSuccess(Gson().toJson(listData))}/*** 请求业主房源数据*/fun getOwnerHouseData(callback: HouseCallback){val listData=ArrayList<OwnerHouseBean>()listData.add(OwnerHouseBean("http://image.mgzf.com/mogoroom/2018-03/mogoApp/7/1/3100687/3100687_1520229043848.jpg!mobile","新安街道 锦华大厦设备全齐","3室2厅2卫-99㎡","宝安区-新安街道","9800元/月"))listData.add(OwnerHouseBean("http://image.mgzf.com/mogoroom/2018-03/mogoApp/7/1/3100687/3100687_1520229043848.jpg!mobile","新安街道 锦华大厦设备全齐","3室2厅2卫-99㎡","宝安区-新安街道","9800元/月"))listData.add(OwnerHouseBean("http://image.mgzf.com/mogoroom/2018-03/mogoApp/7/1/3100687/3100687_1520229043848.jpg!mobile","新安街道 锦华大厦设备全齐","3室2厅2卫-99㎡","宝安区-新安街道","9800元/月"))listData.add(OwnerHouseBean("http://image.mgzf.com/mogoroom/2018-03/mogoApp/7/1/3100687/3100687_1520229043848.jpg!mobile","新安街道 锦华大厦设备全齐","3室2厅2卫-99㎡","宝安区-新安街道","9800元/月"))listData.add(OwnerHouseBean("http://image.mgzf.com/mogoroom/2018-03/mogoApp/7/1/3100687/3100687_1520229043848.jpg!mobile","新安街道 锦华大厦设备全齐","3室2厅2卫-99㎡","宝安区-新安街道","9800元/月"))listData.add(OwnerHouseBean("http://image.mgzf.com/mogoroom/2018-03/mogoApp/7/1/3100687/3100687_1520229043848.jpg!mobile","新安街道 锦华大厦设备全齐","3室2厅2卫-99㎡","宝安区-新安街道","9800元/月"))callback.onSuccess(Gson().toJson(listData))}/*** 请求品牌公寓数据*/fun getApartmentData(callback: HouseCallback){val listData=ArrayList<ApartmentBean>()listData.add(ApartmentBean("http://image.mgzf.com/mogoroom/2018-02/mogoBrand/9/0/2003559/2003559_1517817412022.jpg","http://image.mgzf.com/mogoroom/2018-02/mogoBrand/9/0/2003559/2003559_1517817412022.jpg","梧桐公寓"))listData.add(ApartmentBean("http://image.mgzf.com/mogoroom/2018-02/mogoBrand/9/0/2003559/2003559_1517817412022.jpg","http://image.mgzf.com/mogoroom/2018-02/mogoBrand/9/0/2003559/2003559_1517817412022.jpg","梧桐公寓"))listData.add(ApartmentBean("http://image.mgzf.com/mogoroom/2018-02/mogoBrand/9/0/2003559/2003559_1517817412022.jpg","http://image.mgzf.com/mogoroom/2018-02/mogoBrand/9/0/2003559/2003559_1517817412022.jpg","梧桐公寓"))listData.add(ApartmentBean("http://image.mgzf.com/mogoroom/2018-02/mogoBrand/9/0/2003559/2003559_1517817412022.jpg","http://image.mgzf.com/mogoroom/2018-02/mogoBrand/9/0/2003559/2003559_1517817412022.jpg","梧桐公寓"))listData.add(ApartmentBean("http://image.mgzf.com/mogoroom/2018-02/mogoBrand/9/0/2003559/2003559_1517817412022.jpg","http://image.mgzf.com/mogoroom/2018-02/mogoBrand/9/0/2003559/2003559_1517817412022.jpg","梧桐公寓"))listData.add(ApartmentBean("http://image.mgzf.com/mogoroom/2018-02/mogoBrand/9/0/2003559/2003559_1517817412022.jpg","http://image.mgzf.com/mogoroom/2018-02/mogoBrand/9/0/2003559/2003559_1517817412022.jpg","梧桐公寓"))callback.onSuccess(Gson().toJson(listData))}/*** 请求公寓房源数据*/fun getApartmentHouseData(callback: HouseCallback){val listData=ArrayList<ApartmentHouseBean>()listData.add(ApartmentHouseBean("http://image.mgzf.com/mogoroom/2018-03/mogoApp/7/1/3100687/3100687_1520229043848.jpg!mobile","福田区-锦州大厦","2室2厅1卫-70㎡","6200元/月"))listData.add(ApartmentHouseBean("http://image.mgzf.com/mogoroom/2018-03/mogoApp/7/1/3100687/3100687_1520229043848.jpg!mobile","福田区-锦州大厦","2室2厅1卫-70㎡","6200元/月"))listData.add(ApartmentHouseBean("http://image.mgzf.com/mogoroom/2018-03/mogoApp/7/1/3100687/3100687_1520229043848.jpg!mobile","福田区-锦州大厦","2室2厅1卫-70㎡","6200元/月"))listData.add(ApartmentHouseBean("http://image.mgzf.com/mogoroom/2018-03/mogoApp/7/1/3100687/3100687_1520229043848.jpg!mobile","福田区-锦州大厦","2室2厅1卫-70㎡","6200元/月"))listData.add(ApartmentHouseBean("http://image.mgzf.com/mogoroom/2018-03/mogoApp/7/1/3100687/3100687_1520229043848.jpg!mobile","福田区-锦州大厦","2室2厅1卫-70㎡","6200元/月"))listData.add(ApartmentHouseBean("http://image.mgzf.com/mogoroom/2018-03/mogoApp/7/1/3100687/3100687_1520229043848.jpg!mobile","福田区-锦州大厦","2室2厅1卫-70㎡","6200元/月"))listData.add(ApartmentHouseBean("http://image.mgzf.com/mogoroom/2018-03/mogoApp/7/1/3100687/3100687_1520229043848.jpg!mobile","福田区-锦州大厦","2室2厅1卫-70㎡","6200元/月"))callback.onSuccess(Gson().toJson(listData))}
}

Presenter层的实现

package com.wocus.wine.presenterimport com.wocus.wine.callback.HouseCallback
import com.wocus.wine.entity.*
import com.wocus.wine.model.MainModel
import com.wocus.wine.util.GsonUtil
import com.wocus.wine.view.MainViewclass MainPresenter() {private lateinit var mainView:MainViewconstructor(mainView: MainView) : this() {this.mainView=mainViewmainView.showDialog()getImageBanner()getTextBanner()getMiddleman()getOwnerHouse()getApartment()getApartmentHouse()}private fun getImageBanner() = MainModel().getImageBannerData(object:HouseCallback{override fun onSuccess(data: String) {mainView.showImageBanner(GsonUtil.GsonToList(data,String::class.java))mainView.dismissDialog(1)}override fun onFailure(msg: String) =mainView.showErrorDialog(msg)override fun onError() =mainView.showNoNetDialog()})private fun getTextBanner()=MainModel().getTextBannerData(object :HouseCallback{override fun onSuccess(data: String){mainView.showTextBanner(GsonUtil.GsonToList(data,ItemBean::class.java))mainView.dismissDialog(1)}override fun onFailure(msg: String) = mainView.showErrorDialog(msg)override fun onError() = mainView.showNoNetDialog()})private fun getMiddleman()=MainModel().getMiddlemanData(object :HouseCallback{override fun onSuccess(data: String) {mainView.showMiddlemanData(GsonUtil.GsonToList(data,MiddlemanBean::class.java))mainView.dismissDialog(1)}override fun onFailure(msg: String) =mainView.showErrorDialog(msg)override fun onError() =mainView.showNoNetDialog()})private fun getOwnerHouse()=MainModel().getOwnerHouseData(object :HouseCallback{override fun onSuccess(data: String) {mainView.showOwnerHouseData(GsonUtil.GsonToList(data,OwnerHouseBean::class.java))mainView.dismissDialog(1)}override fun onFailure(msg: String) = mainView.showErrorDialog(msg)override fun onError() = mainView.showNoNetDialog()})private fun getApartment()=MainModel().getApartmentData(object :HouseCallback{override fun onSuccess(data: String) {mainView.showApartmentData(GsonUtil.GsonToList(data, ApartmentBean::class.java))mainView.dismissDialog(1)}override fun onFailure(msg: String) = mainView.showErrorDialog(msg)override fun onError() =mainView.showNoNetDialog()})private fun getApartmentHouse()=MainModel().getApartmentHouseData(object:HouseCallback{override fun onSuccess(data: String) {mainView.showApartmentHouseData(GsonUtil.GsonToList(data, ApartmentHouseBean::class.java))mainView.dismissDialog(1)}override fun onFailure(msg: String) =mainView.showErrorDialog(msg)override fun onError() =mainView.showNoNetDialog()})public fun showAddDialog()=mainView.showAddDialog()public fun rotateAnim(type:Int)=mainView.rotateAnim(type)public fun refresh(){MainPresenter(mainView)mainView.dismissRefresh()}
}

MVP需要的已经搭建完毕,接下来就用在Activity或者Fragment上就OK了

public class MainFragment extends Fragment implements MainView,BaseQuickAdapter.OnItemClickListener,View.OnClickListener,SwipeRefreshLayout.OnRefreshListener {private Banner banner;private VerticalScrollLayout vScrollLayout;private RecyclerView rcyMiddleman;private RecyclerView rcyOwnerHouse;private RecyclerView rcyApartment;private RecyclerView rcyApartmentHouse;private MiddlemanAdapter middlemanAdapter;private OwnerHouseAdapter ownerHouseAdapter;private ApartmentAdapter apartmentAdapter;private ApartmentHouseAdapter apartmentHouseAdapter;private LinearLayoutManager linearLayoutManager;private ProgressDialog progressDialog;private MainPresenter presenter;private SwipeRefreshLayout srl;private TextView txtArea;private TextView txtSearch;private ImageView imgAdd;private int num=0;@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {final View view=inflater.inflate(R.layout.fragment_main,null);banner=view.findViewById(R.id.banner);vScrollLayout = view.findViewById(R.id.scroll_layout);rcyMiddleman=view.findViewById(R.id.main_rcy_middleman);rcyOwnerHouse=view.findViewById(R.id.main_rcy_owner_house);rcyApartment=view.findViewById(R.id.main_rcy_apartment);rcyApartmentHouse=view.findViewById(R.id.main_rcy_apartment_house);txtArea=view.findViewById(R.id.main_txt_area);txtSearch=view.findViewById(R.id.main_txt_search);imgAdd=view.findViewById(R.id.main_img_add);srl=view.findViewById(R.id.mian_srl);view.findViewById(R.id.main_layout_1).setOnClickListener(this);view.findViewById(R.id.main_layout_2).setOnClickListener(this);view.findViewById(R.id.main_layout_3).setOnClickListener(this);view.findViewById(R.id.main_layout_4).setOnClickListener(this);view.findViewById(R.id.main_layout_5).setOnClickListener(this);view.findViewById(R.id.main_layout_6).setOnClickListener(this);view.findViewById(R.id.main_layout_7).setOnClickListener(this);view.findViewById(R.id.main_layout_8).setOnClickListener(this);view.findViewById(R.id.main_layout_middleman_add).setOnClickListener(this);view.findViewById(R.id.main_layout_owner_house).setOnClickListener(this);view.findViewById(R.id.main_layout_apartment).setOnClickListener(this);view.findViewById(R.id.main_layout_apartment_add).setOnClickListener(this);view.findViewById(R.id.main_layout_apartment_house).setOnClickListener(this);imgAdd.setOnClickListener(this);txtArea.setOnClickListener(this);txtSearch.setOnClickListener(this);vScrollLayout.setOnClickListener(this);progressDialog=new ProgressDialog(this.getContext());progressDialog.setMessage("加载中...");progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);progressDialog.setCancelable(false);presenter=new MainPresenter(this);srl.setOnRefreshListener(this);return view;}@Overridepublic void showImageBanner(List<String> listData) {banner.setImages(listData).setImageLoader(new GlideImageLoader()).start();}@Overridepublic void showTextBanner(List<ItemBean> listData) {TextVerticalAdapter adapter=new TextVerticalAdapter(getContext(),listData);vScrollLayout.setAdapter(adapter);adapter.setData(listData);}@Overridepublic void showMiddlemanData(List<MiddlemanBean> listData) {linearLayoutManager=new LinearLayoutManager(getContext());linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);rcyMiddleman.setLayoutManager(linearLayoutManager);middlemanAdapter=new MiddlemanAdapter(R.layout.item_middleman,listData);rcyMiddleman.setAdapter(middlemanAdapter);middlemanAdapter.setOnItemClickListener(this);}@Overridepublic void showOwnerHouseData(List<OwnerHouseBean> listData) {linearLayoutManager=new LinearLayoutManager(getContext());linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);rcyOwnerHouse.setLayoutManager(linearLayoutManager);ownerHouseAdapter=new OwnerHouseAdapter(R.layout.item_owner_house,listData);rcyOwnerHouse.setAdapter(ownerHouseAdapter);ownerHouseAdapter.setOnItemClickListener(this);}@Overridepublic void showApartmentData(List<ApartmentBean> listData) {linearLayoutManager=new LinearLayoutManager(getContext());linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);rcyApartment.setLayoutManager(linearLayoutManager);apartmentAdapter=new ApartmentAdapter(R.layout.item_apartment,listData);rcyApartment.setAdapter(apartmentAdapter);apartmentAdapter.setOnItemClickListener(this);}@Overridepublic void showApartmentHouseData(List<ApartmentHouseBean> listData) {linearLayoutManager=new LinearLayoutManager(getContext());linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);rcyApartmentHouse.setLayoutManager(linearLayoutManager);apartmentHouseAdapter=new ApartmentHouseAdapter(R.layout.item_apartment_house,listData);rcyApartmentHouse.setAdapter(apartmentHouseAdapter);apartmentHouseAdapter.setOnItemClickListener(this);}@Overridepublic void showNoNetDialog() {ToastUtil.show(getContext(),"请检查你的网络");}@Overridepublic void showErrorDialog(String msg) {ToastUtil.show(getContext(),msg);}@Overridepublic void onItemClick(BaseQuickAdapter adapter, View view, int position) {if (Objects.equals(adapter.getClass().getName(), MiddlemanAdapter.class.getName())){ToastUtil.show(getContext(),"经纪人");}else if(Objects.equals(adapter.getClass().getName(), OwnerHouseAdapter.class.getName())){ToastUtil.show(getContext(),"房主房源");startActivity(new Intent(getContext(),HouseDetailsActivity.class));}else if(Objects.equals(adapter.getClass().getName(), ApartmentAdapter.class.getName())){ToastUtil.show(getContext(),"公寓");}else if(Objects.equals(adapter.getClass().getName(), ApartmentHouseAdapter.class.getName())){ToastUtil.show(getContext(),"公寓房源");}}@Overridepublic void showDialog() {progressDialog.show();}@Overridepublic void dismissDialog(int num) {this.num+=num;if (this.num>=6){progressDialog.dismiss();}}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.main_layout_1:{ToastUtil.show(getContext(),"整租");startActivity(new Intent(getContext(),PayActivity.class));break;}case R.id.main_layout_2:{ToastUtil.show(getContext(),"合租");break;}case R.id.main_layout_3:{ToastUtil.show(getContext(),"独栋公寓");break;}case R.id.main_layout_4:{ToastUtil.show(getContext(),"特惠专区");break;}case R.id.main_layout_5:{ToastUtil.show(getContext(),"业主房源");break;}case R.id.main_layout_6:{ToastUtil.show(getContext(),"品牌公寓");break;}case R.id.main_layout_7:{ToastUtil.show(getContext(),"交通");break;}case R.id.main_layout_8:{ToastUtil.show(getContext(),"地图");break;}case R.id.scroll_layout:{ToastUtil.show(getContext(),"新闻");break;}case R.id.main_layout_middleman_add: {ToastUtil.show(getContext(), "入住经纪人");break;}case R.id.main_layout_owner_house: {ToastUtil.show(getContext(), "业主房源");break;}case R.id.main_layout_apartment:{ToastUtil.show(getContext(),"品牌公寓");break;}case R.id.main_layout_apartment_add:{ToastUtil.show(getContext(),"品牌公寓入住");break;}case R.id.main_layout_apartment_house:{ToastUtil.show(getContext(),"品牌公寓房源");break;}case R.id.main_txt_area:{ToastUtil.show(getContext(),"切换地区");break;}case R.id.main_txt_search:{ToastUtil.show(getContext(),"搜索房源");break;}case R.id.main_img_add:{presenter.showAddDialog();break;}}}@Overridepublic void rotateAnim(int type) {Animation anim =new RotateAnimation(type==1?0f:45f,type==1?45f:0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);anim.setFillAfter(true); // 设置保持动画最后的状态anim.setDuration(200); // 设置动画时间anim.setInterpolator(new AccelerateInterpolator()); // 设置插入器imgAdd.startAnimation(anim);}@Overridepublic void showAddDialog() {presenter.rotateAnim(1);View view=getLayoutInflater().inflate(R.layout.layout_main_add,null);PopupWindow popupment=new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT,true);popupment.setBackgroundDrawable(new ColorDrawable(Color.argb(0,0,0,0)));popupment.setOutsideTouchable(true);popupment.setTouchable(true);popupment.setAnimationStyle(R.style.animTranslate);popupment.setOnDismissListener(new PopupWindow.OnDismissListener() {@Overridepublic void onDismiss() {presenter.rotateAnim(0);}});popupment.showAsDropDown(imgAdd,Gravity.RIGHT,0,0 );}@Overridepublic void onRefresh() {presenter.refresh();}@Overridepublic void toast(@NotNull String msg) {ToastUtil.show(getContext(),msg);}@Overridepublic void dismissRefresh() {srl.setRefreshing(false);}
}

Android开发模式之RxJava+Retrofit+MVP(kotlin)相关推荐

  1. Android RxJava+Retrofit+MVP 入门总结

    前言 RxJava+Retrofit+MVP的使用已经推出一段时间了,也一直想找个时间学习一下并且应用到接下来的项目中.趁放假这段时间仔细研究了一下,确实相比于其他框架的学习成本要高一些,不过功能实现 ...

  2. Android开发模式万佛朝中MVX(MVC、MVP、MVVM)

    今天公司的测试服务器开小差了,后台被吐槽的体无完肤,虽然我们都知道跟他没有什么关系,但是生活需要乐趣,总要有人背锅,哈哈!~~~暂时没有环境开发了,那就分享一下之前做的一篇关于Android开发模式的 ...

  3. Rxjava+Retrofit+Mvp的使用实例(基于retrofit2.1.0)

    1.MVP介绍 在Android项目中,Activity和Fragment占据了大部分的开发工作.如果有一种设计模式(或者说代码结构)专门是为优化Activity和Fragment的代码而产生的,你说 ...

  4. 给 Android 开发人员的 RxJava 具体解释

    前言 我从去年開始使用 RxJava .到如今一年多了. 今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava .并且使用的场景越来越多 . 而 ...

  5. RxJava+Retrofit+MVP+Dagger2

    传说中的谷歌四件套,按顺序来哈~ 2017.2.20更新:对于用了一段时间的谷歌四件套的开发者们来说,基础应该都已经掌握的差不多了,但是四件套确实很博大精深,要想完全掌握,一是要学习使用技巧,二是要在 ...

  6. android开发模式,Android开发中无处不在的设计模式

    Android开发中无处不在的设计模式――单例模式 Android开发中无处不在的设计模式――Builder模式 前面介绍了单例模式和Builder模式,有兴趣的见上面两个链接,这篇文章侧重介绍1下视 ...

  7. 【Bugly 技术干货】Android开发必备知识:为什么说Kotlin值得一试

    1.Hello, Kotlin Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 1 ...

  8. Android 开发究竟是选择 Java 还是 Kotlin?Google 有话说

    Google 对于从 Java 切换到 Kotlin 时的注意事项提供了第一手的经验,本文对此作了详细阐述. 来源:medium.com 作者 | Nick Heath 译者 | 苏本如,责编 | 屠 ...

  9. 【三种常见架构开发模式:MVC、MVP、MVVM】

    写目录 1.常见的三种开发模式 (1)MVC模式(感觉重点在view) (2) MVP模式 (感觉重点在 Presenter) (3)MVVM模式(感觉重点在VM,viewModel) 1.常见的三种 ...

最新文章

  1. .NET重构—单元测试的代码重构
  2. .NET Framework介绍
  3. 继承 :5、程序设计 类:汽车类 属性:排量(outPut),颜色(color) 行为:驾驶(drive)
  4. war包发布找不见路径 weblogic getResource 与getRealPath
  5. 手机应用开发的方式不能完全套用到iPad上
  6. Vue 高效清空表单,一键清空表单
  7. 首个智能风控国际标准发布,蚂蚁风控技术入局全球
  8. Android源码分析:Activity启动流程
  9. [答疑]请问商品领用审批的序列图画的对么
  10. python爬取全国真实地址_python爬虫学习之爬取全国各省市县级城市邮政编码
  11. C++ Primer 第5版--练习8.4
  12. linux安装程序时Cannot uninstall XXX. It is a distutils installed project and thus we cannot accurately
  13. 使用LIS2DH12三轴加速度传感器检测震动与倾斜角度
  14. Js之$.ajax回调函数获取结果的问题-yellowcong
  15. 百元降噪耳机推荐有哪些品牌?适合学生党使用的降噪蓝牙耳机分享
  16. kali使用笔记本自带无线网卡_不会选无线网卡看过来!再也不花冤枉钱了.........
  17. 生物蛋白质数据库类型【总结】
  18. 腾讯音乐 知乎 微信公众账户 搜狗
  19. 如何解决夜神模拟器连不上adb的问题
  20. Python 进程和设计模式

热门文章

  1. 单样本学习:使用孪生神经网络进行人脸识别
  2. MATLAB实现图像的放大和缩放
  3. 颜色的几个术语和属性
  4. 关于ListView的优化总结
  5. JavaScript:对象可枚举和不可枚举属性
  6. 联合早报网论坛,被称为“东方芝加哥”的武汉,你曾被谁抛弃。
  7. 2021网络安全宣传周,数字联盟解读用户隐私保护
  8. 十七、反射与动态代理
  9. Java游戏项目之俄罗斯方块
  10. java多线程-基础