Retrofit,RecyclerViewMVP模式
//添加依赖
compile 'com.android.support:appcompat-v7:26.+' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'io.reactivex.rxjava2:rxjava:2.1.7' compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' compile 'com.github.bumptech.glide:glide:4.3.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.3.1' compile 'com.android.support:recyclerview-v7:26.0.0-alpha1' compile 'com.jcodecraeer:xrecyclerview:1.2.0' compile 'com.facebook.fresco:fresco:0.12.0' // 在 API < 14 上的机器支持 WebP 时,需要添加 compile 'com.facebook.fresco:animated-base-support:0.12.0' // 支持 GIF 动图,需要添加 compile 'com.facebook.fresco:animated-gif:0.12.0' // 支持 WebP (静态图+动图),需要添加 compile 'com.facebook.fresco:animated-webp:0.12.0' compile 'com.facebook.fresco:webpsupport:0.12.0' // 仅支持 WebP 静态图,需要添加 compile 'com.facebook.fresco:webpsupport:0.12.0' testCompile 'junit:junit:4.12' main_activity
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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.bwei.heqi20171207.MainActivity"><com.jcodecraeer.xrecyclerview.XRecyclerView android:id="@+id/xrecy" android:layout_width="match_parent" android:layout_height="match_parent"></com.jcodecraeer.xrecyclerview.XRecyclerView></LinearLayout>
//rv_list
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"><com.facebook.drawee.view.SimpleDraweeView android:id="@+id/ximg" android:layout_width="250dp" android:layout_height="250dp" fresco:roundAsCircle="true" /><TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/name" android:layout_below="@+id/ximg" /></RelativeLayout> //MainActivity
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.util.Log; import android.view.View;import com.bwei.heqi20171207.adaptrer.XAdapter; import com.bwei.heqi20171207.bean.News; import com.bwei.heqi20171207.model.NewsModel; import com.bwei.heqi20171207.presenter.NewsPresenter; import com.bwei.heqi20171207.view.IView; import com.facebook.drawee.backends.pipeline.Fresco; import com.jcodecraeer.xrecyclerview.ProgressStyle; import com.jcodecraeer.xrecyclerview.XRecyclerView;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;import static android.R.id.list;public class MainActivity extends AppCompatActivity implements IView{private XRecyclerView xrecy;private NewsPresenter presenter;private XAdapter xAdapter;private List<News> list;private int num = 10;private Map<String, String> map;@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Fresco.initialize(this);setContentView(R.layout.activity_main);xrecy = findViewById(R.id.xrecy);//设置可上拉 xrecy.setPullRefreshEnabled(true);xrecy.setLoadingMoreEnabled(true);//设置上拉下拉样式 xrecy.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);xrecy.setLaodingMoreProgressStyle(ProgressStyle.BallClipRotate);LinearLayoutManager manager = new LinearLayoutManager(this);xrecy.setLayoutManager(manager);map = new HashMap<>();map.put("key", "71e58b5b2f930eaf1f937407acde08fe");map.put("num","10");presenter = new NewsPresenter();presenter.attachView(this);presenter.getData(map);xrecy.setLoadingListener(new XRecyclerView.LoadingListener() {@Override public void onRefresh() {num = 10;list.clear();//清空一下集合 NewsModel newsModel = new NewsModel(presenter);newsModel.getData(map);;xrecy.refreshComplete();//关闭 }@Override public void onLoadMore() {num++;NewsModel newsModel = new NewsModel(presenter);newsModel.getData(map);xrecy.loadMoreComplete();}});}@Override public void onSuccess(Object o) {list = (List<News>)o;XAdapter xAdapter = new XAdapter(this, list);xrecy.setAdapter(xAdapter);xAdapter.notifyDataSetChanged();}@Override public void onFailed(Exception e) {Log.e("2", "onFailed: " + e.getMessage());}//内存泄漏 @Override protected void onDestroy() {super.onDestroy();if (presenter != null) {presenter.detachView();}} } m层 接口
import java.util.Map;/** * Created by HQ on 2017/12/7. */ public interface IModel {void getData(Map<String,String> map);} NewsModel类
//v层 接口
public interface IView {void onSuccess(Object o);void onFailed(Exception e); } p层 接口
NewsPresenter类
import android.util.Log;import com.bwei.heqi20171207.bean.MessageBean; import com.bwei.heqi20171207.bean.News; import com.bwei.heqi20171207.model.IModel; import com.bwei.heqi20171207.model.NewsModel; import com.bwei.heqi20171207.view.IView;import org.reactivestreams.Subscriber;import java.util.List; import java.util.Map;import javax.security.auth.login.LoginException;import io.reactivex.Flowable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import io.reactivex.subscribers.DisposableSubscriber;/** * Created by WuXirui * Create Time: 2017/12/6 * Description: */ public class NewsPresenter implements BasePresenter {private IView iv;private DisposableSubscriber subscriber;public void attachView(IView iv) {this.iv = iv;}public void detachView() {if (iv != null) {iv = null;}if (subscriber != null) {if (!subscriber.isDisposed()) {subscriber.dispose();}}}@Override public void getData(Map<String, String> map) {NewsModel model = new NewsModel(this);model.getData(map);}public void getNews(Flowable<MessageBean<List<News>>> flowable) {subscriber = (DisposableSubscriber) flowable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribeWith(new DisposableSubscriber<MessageBean<List<News>>>() {@Override public void onNext(MessageBean<List<News>> listMessageBean) {List<News> newslite = listMessageBean.getNewslite();Log.i("TAG2",newslite.size()+"");iv.onSuccess(newslite);}@Override public void onError(Throwable t) {iv.onFailed(new Exception(t));}@Override public void onComplete() {}});} }
bean包
import java.util.List;/** * Created by HQ on 2017/12/7. */ public class MessageBean<T> {/** * code : 200 * msg : success * newslist : [{"ctime":"2016-12-04 13:00","title":"格林:理解科尔吸食大麻 不过我从没吸过","description":"NBA新闻","picUrl":"http://www.51tyw.com/uploads/allimg/161204/1-161204120131.jpg","url":"http://www.51tyw.com/nba/2421.html"},{"ctime":"2016-12-04 00:00","title":"三分纪录延续!火箭队连续19场比赛命中10+三分球","description":"NBA新闻","picUrl":"http://www.51tyw.com/uploads/allimg/161203/1-161203233J3.jpg","url":"http://www.51tyw.com/nba/2417.html"},{"ctime":"2016-12-04 00:00","title":"詹姆斯谈三连败:是时候紧起来了 必须打得男人点","description":"NBA新闻","picUrl":"http://www.51tyw.com/uploads/allimg/161203/1-161203234010.jpg","url":"http://www.51tyw.com/nba/2418.html"},{"ctime":"2016-12-03 12:00","title":"骑士输赢都靠三分?那还要詹姆斯做什么?","description":"NBA新闻","picUrl":"http://www.51tyw.com/uploads/allimg/161203/1-161203104344.jpg","url":"http://www.51tyw.com/nba/2407.html"},{"ctime":"2016-12-03 00:00","title":"公牛vs骑士直播看点:詹伟兄弟对决","description":"NBA新闻","picUrl":"http://www.51tyw.com/uploads/allimg/161202/1-161202221205.jpg","url":"http://www.51tyw.com/nba/2395.html"},{"ctime":"2016-12-02 22:00","title":"火箭和勇士联手创NBA三分纪录","description":"NBA新闻","picUrl":"http://www.51tyw.com/uploads/allimg/161202/1-161202214212.jpg","url":"http://www.51tyw.com/nba/2392.html"},{"ctime":"2016-12-02 22:00","title":"巴克利:勇士打得像女式篮球,太软了!","description":"NBA新闻","picUrl":"http://www.51tyw.com/uploads/allimg/161202/1-161202215032.jpg","url":"http://www.51tyw.com/nba/2394.html"},{"ctime":"2016-12-02 20:00","title":"詹姆斯完成月最佳球员4连霸的壮举!","description":"NBA新闻","picUrl":"http://www.51tyw.com/uploads/allimg/161202/1-1612021PI0.jpg","url":"http://www.51tyw.com/nba/2388.html"},{"ctime":"2016-12-01 00:00","title":"威少再下三双战书!詹皇会不会先认怂?","description":"NBA新闻","picUrl":"http://www.51tyw.com/uploads/allimg/161128/1-16112Q13251.jpg","url":"http://www.51tyw.com/nba/2374.html"},{"ctime":"2016-12-01 00:00","title":"骑士这样的防守想夺冠?也许卫冕只是空谈!","description":"NBA新闻","picUrl":"http://www.51tyw.com/uploads/allimg/161130/1-161130222229.jpg","url":"http://www.51tyw.com/nba/2375.html"}] */ private String code;private String msg;private T newslist;public MessageBean(String code, String msg, T newslist) {this.code = code;this.msg = msg;this.newslist = newslist;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public T getNewslite() {return newslist;}public void setNewslite(T newslite) {this.newslist = newslist;}@Override public String toString() {return "MessageBean{" +"code='" + code + '\'' +", msg='" + msg + '\'' +", newslist=" + newslist +'}';} }
ctime "2016-12-04 13:00" title "格林:理解科尔吸食大麻 不过我从没吸过" description "NBA新闻" picUrl "http://www.51tyw.com/uploads/allimg/161204/1-161204120131.jpg" url "http://www.51tyw.com/nba/2421.html"*/ public class News {private String ctime;private String title;private String description;private String picUrl;private String url;public News(String ctime, String title, String description, String picUrl, String url) {this.ctime = ctime;this.title = title;this.description = description;this.picUrl = picUrl;this.url = url;}public String getCtime() {return ctime;}public void setCtime(String ctime) {this.ctime = ctime;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}public String getPicUrl() {return picUrl;}public void setPicUrl(String picUrl) {this.picUrl = picUrl;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}@Override public String toString() {return "News{" +"ctime='" + ctime + '\'' +", title='" + title + '\'' +", description='" + description + '\'' +", picUrl='" + picUrl + '\'' +", url='" + url + '\'' +'}';} } http包
import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory;/** * Created by WuXirui * Create Time: 2017/12/6 * Description: */ public class RetrofitUtils {private static volatile RetrofitUtils instance;private ApiService apiService;private RetrofitUtils() {Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).baseUrl("http://api.tianapi.com/").build();apiService = retrofit.create(ApiService.class);}//单例模式 public static RetrofitUtils getInstance() {if (instance == null) {synchronized (RetrofitUtils.class) {if (null == instance) {instance = new RetrofitUtils();}}}return instance;}public ApiService getApiService() {return apiService;} }
adapter
import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.TextView;import com.bwei.heqi20171207.R; import com.bwei.heqi20171207.bean.News; import com.facebook.drawee.view.SimpleDraweeView;import java.util.ArrayList; import java.util.List;/** * Created by HQ on 2017/12/2. */ public class XAdapter extends RecyclerView.Adapter<XAdapter.ViewHolder>{private Context context;private List<News> list;public XAdapter(Context context, List<News> list) {this.context = context;this.list = list;}@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = View.inflate(context, R.layout.rv_list, null);ViewHolder viewHolder = new ViewHolder(view);return viewHolder;}@Override public void onBindViewHolder(ViewHolder holder, int position) {holder.ximg.setImageURI(list.get(position).getPicUrl());holder.name.setText(list.get(position).getTitle());}@Override public int getItemCount() {return list.size();}class ViewHolder extends RecyclerView.ViewHolder{private final SimpleDraweeView ximg;private final TextView name;public ViewHolder(View itemView) {super(itemView);name = (TextView) itemView.findViewById(R.id.name);ximg = (SimpleDraweeView) itemView.findViewById(R.id.ximg);}} }
import com.bwei.heqi20171207.bean.MessageBean; import com.bwei.heqi20171207.bean.News;import java.util.List; import java.util.Map;import io.reactivex.Flowable; import retrofit2.http.GET; import retrofit2.http.QueryMap;/** * Created by HQ on 2017/12/7. */ 接口 public interface ApiService {@GET("nba/")Flowable<MessageBean<List<News>>> getHeqi(@QueryMap Map<String, String> map); }
RetrofitUtils工具类
import java.util.Map;/** * Created by HQ on 2017/12/7. */ public interface BasePresenter {void getData(Map<String,String> map); }
import com.bwei.heqi20171207.bean.MessageBean; import com.bwei.heqi20171207.bean.News; import com.bwei.heqi20171207.http.RetrofitUtils; import com.bwei.heqi20171207.presenter.NewsPresenter;import java.util.List; import java.util.Map;import io.reactivex.Flowable;/** * Created by HQ on 2017/12/7. */ //网络请求 public class NewsModel implements IModel {private NewsPresenter presenter;public NewsModel(NewsPresenter presenter){this.presenter=presenter;}@Override public void getData(Map<String, String> map) {Flowable<MessageBean<List<News>>> flowable = RetrofitUtils.getInstance().getApiService().getHeqi(map);presenter.getNews(flowable);} }
Retrofit,RecyclerViewMVP模式相关推荐
- Retrofit 使用详解
转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51910837 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...
- android retrofit 从无知到入门
android retrofit 从无知到入门 前言 一.初识retrofit 1.retrofit是什么? 2.一些配置和数据准备 3.快速上手retrofit a.接口 b.实现 c.execut ...
- Glide核心设计二:缓存管理
原文链接:Glide核心设计二:缓存管理 引言 Glide作为一个优秀的图片加载框架,缓存管理是必不可少的一部分,这篇文章主要通过各个角度.从整体设计到代码实现,深入的分析Glide的缓存管理模块,力 ...
- 大淘宝服务端技术干货沉淀和总结
网络基础 TCP三次握手 三次握手过程 客户端--发送带有SYN标志的数据包--服务端 一次握手 Client进入syn_sent状态 服务端--发送带有SYN/ACK标志的数据包--客户端 二次握手 ...
- python 各种模块学习
from:https://blog.csdn.net/weiwangchao_/article/details/70570508 转载:.... Python的模块大全,很全,有详细介绍! 另外附Py ...
- kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式...
2019独角兽企业重金招聘Python工程师标准>>> 今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小 ...
- java mvp模式_MVP模式入门(结合Rxjava,Retrofit)
本文MVP的sample实现效果: 老规矩,在说对MVP模式的理解之前还是要再谈谈MVC模式,了解了MVC的缺点.我们才知道为什么要用MVP. 关于MVC的图解,我在网上找到了一些图.如下: MVC模 ...
- Android MVP开发模式及Retrofit + RxJava封装
代码已上传到Github,因为接口都是模拟无法进行测试,明白大概的逻辑就行了! 欢迎浏览我的博客--https://pushy.site 1. MVP模式 1.1 介绍 如果熟悉MVP模式架构的话,对 ...
- Android代理模式(静态代理,动态代理,Retrofit代理模式分析)
文章目录 代理模式 前言:AOP编程(面向切面编程) 一. 代理思想 1. 静态代理 2. 动态代理 3. 动态代理的实现 二. Retrofit代理模式分析 代理模式 前言:AOP编程(面向切面编程 ...
- TLint for 虎扑体育 基于Dagger2+RxJava+Retrofit开发,采用MVP模式
TLint 类别: 完整源码 打分: ★★★★★ 更新: 2016-05-12 09:54 大小: 6976 kb 开发环境: Android Studio 浏览: 484 次 下载: 83 次 项目 ...
最新文章
- c语言输出精确圆周率,如何设计C语言程序输出圆周率小数点后的1000位?请大侠出手啊。...
- Google员工自述:在哈佛教书和在Google工作的差别
- springboot使用@Scheduled作定时任务详细用法
- python 字典定义日志用法_python中字典(Dictionary)用法实例详解
- 菜鸟学IT之python3关于列表,元组,字典,集合浅认识!
- Tomcat详解(十一)——Tomcat管理
- ActivityGroup切换不用每次加载视图
- 教你如何用java开发Alexa语音设备。全程详细介绍。
- 判断43是不是质数用c语言,1是素数吗(c语言判断一个数为素数)
- 显示计算机101代码,电脑出现蓝屏故障101停机码,怎么解决问题
- 【她的心你伤的起吗?】
- xilinx vivado 2019 cordic ip 计算sin cos
- Vue错误03:Property or method “xxx“ is not defined on the instance but referenced during render.
- 工业智能网关解决方案:物联网仓储环境监测系统
- 工业物联 成就智能制造 IIoT未来布局!OFweek 2019工业物联网技术与应用峰会4月即将来袭
- MAPInfo Professional v10.0026及MapX5.0安装说明
- 无人机、无人船通信协议——MAVLink(V1.0、V2.0,心跳包,GPS定位,7种飞行模式)
- 23年最新!盘点深圳最值得加入的公司!
- Southern and Volga Russia Qualifier 2019-2020(L. Printer (枚举))
- 如何在github下载别人的代码到本地的unity
热门文章
- Win10配置ssh密钥免密连接Linux服务器
- 图片文字识别 mysql_有道智云OCR图片识别文字+返回数据处理技巧(实现语言-按键精灵脚本请求识别+java服务端处理数据)...
- 测试方案包含哪些内容?
- 【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)
- 目标客户画像_用户画像是什么?怎么做用户画像?
- 为什么Java中的float型最大值大于long型?
- 计算S=a+aa+…+aa…a
- 关于PPT母版的含义和使用方法
- U盘被写保护无法格式化(我用win10,同样成功格式化了U盘)
- Android开发——监听Android手机的网络状态