//添加依赖

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模式相关推荐

  1. Retrofit 使用详解

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/51910837 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的 ...

  2. android retrofit 从无知到入门

    android retrofit 从无知到入门 前言 一.初识retrofit 1.retrofit是什么? 2.一些配置和数据准备 3.快速上手retrofit a.接口 b.实现 c.execut ...

  3. Glide核心设计二:缓存管理

    原文链接:Glide核心设计二:缓存管理 引言 Glide作为一个优秀的图片加载框架,缓存管理是必不可少的一部分,这篇文章主要通过各个角度.从整体设计到代码实现,深入的分析Glide的缓存管理模块,力 ...

  4. 大淘宝服务端技术干货沉淀和总结

    网络基础 TCP三次握手 三次握手过程 客户端--发送带有SYN标志的数据包--服务端 一次握手 Client进入syn_sent状态 服务端--发送带有SYN/ACK标志的数据包--客户端 二次握手 ...

  5. python 各种模块学习

    from:https://blog.csdn.net/weiwangchao_/article/details/70570508 转载:.... Python的模块大全,很全,有详细介绍! 另外附Py ...

  6. kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式...

    2019独角兽企业重金招聘Python工程师标准>>> 今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小 ...

  7. java mvp模式_MVP模式入门(结合Rxjava,Retrofit)

    本文MVP的sample实现效果: 老规矩,在说对MVP模式的理解之前还是要再谈谈MVC模式,了解了MVC的缺点.我们才知道为什么要用MVP. 关于MVC的图解,我在网上找到了一些图.如下: MVC模 ...

  8. Android MVP开发模式及Retrofit + RxJava封装

    代码已上传到Github,因为接口都是模拟无法进行测试,明白大概的逻辑就行了! 欢迎浏览我的博客--https://pushy.site 1. MVP模式 1.1 介绍 如果熟悉MVP模式架构的话,对 ...

  9. Android代理模式(静态代理,动态代理,Retrofit代理模式分析)

    文章目录 代理模式 前言:AOP编程(面向切面编程) 一. 代理思想 1. 静态代理 2. 动态代理 3. 动态代理的实现 二. Retrofit代理模式分析 代理模式 前言:AOP编程(面向切面编程 ...

  10. TLint for 虎扑体育 基于Dagger2+RxJava+Retrofit开发,采用MVP模式

    TLint 类别: 完整源码 打分: ★★★★★ 更新: 2016-05-12 09:54 大小: 6976 kb 开发环境: Android Studio 浏览: 484 次 下载: 83 次 项目 ...

最新文章

  1. c语言输出精确圆周率,如何设计C语言程序输出圆周率小数点后的1000位?请大侠出手啊。...
  2. Google员工自述:在哈佛教书和在Google工作的差别
  3. springboot使用@Scheduled作定时任务详细用法
  4. python 字典定义日志用法_python中字典(Dictionary)用法实例详解
  5. 菜鸟学IT之python3关于列表,元组,字典,集合浅认识!
  6. Tomcat详解(十一)——Tomcat管理
  7. ActivityGroup切换不用每次加载视图
  8. 教你如何用java开发Alexa语音设备。全程详细介绍。
  9. 判断43是不是质数用c语言,1是素数吗(c语言判断一个数为素数)
  10. 显示计算机101代码,电脑出现蓝屏故障101停机码,怎么解决问题
  11. 【她的心你伤的起吗?】
  12. xilinx vivado 2019 cordic ip 计算sin cos
  13. Vue错误03:Property or method “xxx“ is not defined on the instance but referenced during render.
  14. 工业智能网关解决方案:物联网仓储环境监测系统
  15. 工业物联 成就智能制造 IIoT未来布局!OFweek 2019工业物联网技术与应用峰会4月即将来袭
  16. MAPInfo Professional v10.0026及MapX5.0安装说明
  17. 无人机、无人船通信协议——MAVLink(V1.0、V2.0,心跳包,GPS定位,7种飞行模式)
  18. 23年最新!盘点深圳最值得加入的公司!
  19. Southern and Volga Russia Qualifier 2019-2020(L. Printer (枚举))
  20. 如何在github下载别人的代码到本地的unity

热门文章

  1. Win10配置ssh密钥免密连接Linux服务器
  2. 图片文字识别 mysql_有道智云OCR图片识别文字+返回数据处理技巧(实现语言-按键精灵脚本请求识别+java服务端处理数据)...
  3. 测试方案包含哪些内容?
  4. 【白话经典算法系列之十二】数组中只出现1次的两个数字(百度面试题)
  5. 目标客户画像_用户画像是什么?怎么做用户画像?
  6. 为什么Java中的float型最大值大于long型?
  7. 计算S=a+aa+…+aa…a
  8. 关于PPT母版的含义和使用方法
  9. U盘被写保护无法格式化(我用win10,同样成功格式化了U盘)
  10. Android开发——监听Android手机的网络状态