1. 程式人生 > >Mvp(RxJava2+Retrofit2+fresco+recyclerview)

Mvp(RxJava2+Retrofit2+fresco+recyclerview)

//依賴 
//recyclerview
compile 'com.android.support:recyclerview-v7:26.+'
//rxjava2
compile "io.reactivex.rxjava2:rxjava:2.1.7"
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
//retrofit2
compile 'com.squareup.retrofit2:retrofit:2.3.0'//retrofit依賴
compile 'com.squareup.retrofit2:converter-gson:2.3.0'//retrofit內部封裝的GSON
compile "com.squareup.retrofit2:adapter-rxjava2:2.3.0" //fresco compile 'com.facebook.fresco:fresco:+' compile 'com.facebook.fresco:animated-gif:+'//支援gif }
//清單 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
android:name=".App"
//App
public class App extends Application {

    @Override
public void onCreate() { super.onCreate(); //1. 用於全域性配置初始化Fresco 圖片載入 Fresco.initialize(this); } }

//activity_main
<?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.example.rxjavas.view.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
//item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

    <com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/sdv"
android:layout_width="100dp"
android:layout_height="80dp"
android:padding="10dp"
android:src="@mipmap/ic_launcher_round"
fresco:roundAsCircle="true" />

    <TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="11111111"
android:textColor="#000" />

    <TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="11111111"
android:textColor="#f00" />
</LinearLayout>
//interfaces
//IView
public interface IView {
    void OnSuccess(List<Bean.DataBeanX.DataBean> list);

    void OnFailed(Exception e);
}
//IPresenter
public interface IPresenter {
    void getData(Map<String, String> map);
}
//IModel
public interface IModel {
    void getData(Map<String, String> map);
}
//ApiService
public interface ApiService {
    @GET("/neihan/stream/mix/v1/")
    Flowable<Bean> getNews(@QueryMap Map<String, String> map);
}
//MainActivity
public class MainActivity extends AppCompatActivity implements IView {
    private RecyclerView rv;
    private Presenter presenter;
    private List<Bean.DataBeanX.DataBean> list = new ArrayList<>();
    private MyAdapter adapter;

    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Fresco.initialize(this);
        setContentView(R.layout.activity_main);
        rv = findViewById(R.id.rv);
        presenter = new Presenter(this);
        //Presenter.attachView(getActivity());
        /*map.put("key", "71e58b5b2f930eaf1f937407acde08fe");
        map.put("num", "10");*/
Map<String, String> map = new HashMap<>();
        map.put("content_type", "-102");
        adapter = new MyAdapter(MainActivity.this, list);
        presenter.getData(map);
        rv.setLayoutManager(new LinearLayoutManager(MainActivity.this));
        adapter = new MyAdapter(MainActivity.this, list);
        rv.setAdapter(adapter);
    }

    @Override
public void OnSuccess(List<Bean.DataBeanX.DataBean> data) {
        Log.d("aaa", data.size() + "");
        list.addAll(data);
        adapter.notifyDataSetChanged();
        //Toast.makeText(getActivity(), "資料:" + data.toString(), Toast.LENGTH_SHORT).show();
}

    @Override
public void OnFailed(Exception e) {
        Log.e("===", "onFailed: " + e.getMessage());
    }
}

//Presenter
public class Presenter implements IPresenter {
    private IView iView;
    private IModel model;
    private DisposableSubscriber<Bean> subscriber;

    public Presenter(IView iView) {
        this.iView = iView;
        model = new Model(this);
    }

    @Override
public void getData(Map<String, String> map) {
        model.getData(map);
    }

    public void detachView() {
        if (subscriber != null) {
            //如果該資源已被處理,則可一次性返回true。如果沒有被處理返回false
if (!subscriber.isDisposed()) {
                subscriber.dispose();
            }
        }

    }

    public void get(Flowable<Bean> flowable) {
        subscriber = flowable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new DisposableSubscriber<Bean>() {
                    @Override
public void onNext(Bean listMessageBean) {
                        if (listMessageBean != null) {
                            List<Bean.DataBeanX.DataBean> newslist = listMessageBean.getData().getData();
                            if (listMessageBean != null) {
                                iView.OnSuccess(newslist);
                            }
                        }
                    }

                    @Override
public void onError(Throwable t) {
                        //Log.d("===", t.toString());
                        //iView.OnFailed(new Exception(t));
}

                    @Override
public void onComplete() {

                    }
                });
    }
}
//Model
public class Model implements IModel {

    private Presenter presenter;

    public Model(Presenter presenter) {
        this.presenter = presenter;
    }

    @Override
public void getData(Map<String, String> map) {
        Flowable<Bean> flowable = RetrofitUtils.getInstance().getApiService().getNews(map);
        presenter.get(flowable);
    }
}
//RetrofitUtils
public class RetrofitUtils {
    private static volatile RetrofitUtils instance;
    private final Retrofit retrofit;

    private RetrofitUtils() {
        retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .baseUrl("http://lf.snssdk.com")
                .build();
    }

    public static RetrofitUtils getInstance() {
        if (instance == null) {
            synchronized (RetrofitUtils.class) {
                if (instance == null) {
                    instance = new RetrofitUtils();
                }
            }
        }
        return instance;
    }

    public ApiService getApiService() {
        ApiService apiService = retrofit.create(ApiService.class);
        return apiService;
    }

}
//MyAdapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<Bean.DataBeanX.DataBean> list = new ArrayList<>();
    private Context context;
    private View convertView;

    public MyAdapter(Context context, List<Bean.DataBeanX.DataBean> list) {
        this.context = context;
        this.list = list;
    }

    @Override
public int getItemViewType(int position) {
        if (list.get(position).getGroup().getMp4_url() != null) {
        }
        return super.getItemViewType(position);
    }

    @Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        convertView = View.inflate(context, R.layout.item, null);
        ViewHolder holder = new ViewHolder(convertView);
        return holder;
    }

    public void onBindViewHolder(ViewHolder holder, final int position) {
        Uri parse = Uri.parse(list.get(position).getGroup().getUser().getAvatar_url());
        if (parse != null) {
            holder.sdv.setImageURI(parse);
        }
        holder.tv1.setText(list.get(position).getGroup().getUser().getName());
        holder.tv2.setText(list.get(position).getGroup().getText());


    }

    @Override
public int getItemCount() {
        return list.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {
        TextView tv1, tv2;
        SimpleDraweeView sdv;

        public ViewHolder(View itemView) {
            super(itemView);
            sdv = convertView.findViewById(R.id.sdv);
            tv1 = convertView.findViewById(R.id.tv1);
            tv2 = convertView.findViewById(R.id.tv2);

        }
    }

}

//依賴 
//recyclerview
compile 'com.android.support:recyclerview-v7:26.+'
//rxjava2
compile "io.reactivex.rxjava2:rxjava:2.1.7"
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
//retrofit2
compile 'com.squareup.retrofit2:retrofit:2.3.0'//retrofit依賴
compile 'com.squareup.retrofit2:converter-gson:2.3.0'//retrofit內部封裝的GSON
compile "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
//fresco
compile 'com.facebook.fresco:fresco:+'
compile 'com.facebook.fresco:animated-gif:+'//支援gif
}
//清單 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
android:name=".App"
//App
public class App extends Application {

    @Override
public void onCreate() {
        super.onCreate();
        //1.  用於全域性配置初始化Fresco 圖片載入
Fresco.initialize(this);

    }
}

//activity_main
<?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.example.rxjavas.view.MainActivity">

    <android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
//item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

    <com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/sdv"
android:layout_width="100dp"
android:layout_height="80dp"
android:padding="10dp"
android:src="@mipmap/ic_launcher_round"
fresco:roundAsCircle="true" />

    <TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="11111111"
android:textColor="#000" />

    <TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="11111111"
android:textColor="#f00" />
</LinearLayout>
//interfaces

            
           

相關推薦

Mvp(RxJava2+Retrofit2+fresco+recyclerview)

//依賴 //recyclerview compile 'com.android.support:recyclerview-v7:26.+' //rxjava2 compile "io.reactivex.rxjava2:rxjava:2.1.7" compile '

簡單MVP+RxJava2+Retrofit2 搭建一個屬於自己的開發框架

一:序言 2016年安卓熱門詞彙MVP,RxJava,Retrofit。時隔一年這些框架依然是很常用的,現在來把這幾個關鍵詞整合起來,搭建一個快速開發框架。。。 二: MVP是什麼? 對於一些剛學安卓的朋友們應該還不是太熟悉,我們先來溫習一下吧!   這

個人專案-一之(MVP+RxJava2+Retrofit2+RxBus+Glide)

很早之前就想寫一個個人專案練練手,但是由於工作的關係,一直沒有真正的開動(其實就是懶)。 好吧,反正最近這幾個星期稍微比較清閒,趁著這個機會,在空餘時間擼了一個個人專案。 一之 簡介 “一之”是一款資訊類App,主要實現的內容如下: 主頁(知

Android:這是一份非常詳細的MVP+Rxjava2.0+Retrofit2.0相結合舉例RecyclerView的實戰篇章

MVP+Rxjava2.0+Retrofit2.0現在是非常火的組合 MVP相信大家已經在各大網站和各大佬的文章中已經瞭解很多理論的理解了 MVP其實就是M層請求資料 在P層裡進行M層和V層的互動 V層得到資料後展示資料 比如說豺狼媽媽去捕食 捕到食物後

fresco+recyclerView展示+MVP

public class Contant { public static final String BAUS_URI = "http://www.zhaoapi.cn/"; } public interface Api { @GET("home/getHome") Cal

Demo:側滑刪除+Fresco+rxjava2+retrofit2

1. // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositorie

Android中使用RecyclerView+RxJava2+Retrofit2+Butterkinfe8.5.1實現簡單的新聞列表顯示

Android中實現簡單的新聞列表 在剛開始寫CSDN的時候,寫過一篇 Android中通過ListView實現簡單的新聞列表 最近看到有很多剛開始學習Android的同學需要原始碼。不好意思的是,那個例子的原始碼已經不在了。 所以這裡重新寫一篇並且附

RxJava2+Retrofit2+RxLifecycle2使用MVP模式構建專案

前言 眼下Retrofit+RxJava搭配的網路請求框架很是流行,本著學習的態度,寫了一個相關的demo。寫著寫著就想朝著搭建一個專案框架的方向走。於是使用了一下MVP模式。 RxJava 確實挺好用,個人特別喜歡這種“流式”的程式碼風格,邏輯很清晰,起碼

RxJava2+Retrofit2+OkHttp3遇到的問題

剛開始玩這個。遇到的問題記錄下做個筆記。 問題1.transformResourcesWithMergeJavaResForDebug Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDeb

Android ,MVP+retrofit +rxjava+glide recyclerview使用詳解 ,條目點選 長按點選,三種管理器 ,分割線

首先是對應的依賴  implementation 'com.android.support:recyclerview-v7:26.1.0' 下面是對應的介面卡 裡面對應的 有點選的註釋 public class HomeAdaper extends RecyclerV

RxJava2 + Retrofit2 處理data為null的情況

最近專案中使用了RxJava2+ Retrofit2框架,框架基本都是統一封裝HttpBean,使用map操作符轉化資料,然後根據code碼的邏輯去處理業務,開發過程中遇到一個問題,伺服器返回的json資料格式為{"code": 200, "data": null, "message": nul

RxJava2+Retrofit2+okHttp的二次封裝

專案Demo已經上傳至github連結本人android小白一枚,在學習android的過程中,我感受很深,在做了這麼多練手的專案之後,我覺得android就像一塊畫板,畫板是白紙,作為android的開發人員,要做的就是運用一切可能,去在畫板上畫出讓人看的懂並且美觀的畫。說

RxJava2+Retrofit2網路請求框架封裝及使用

最近把RxJava2和Retrofit2學習了一下,並做了一個簡單的封裝,算是對學習的總結,以及以後的做專案時可以,可以拿來及用。 注意:本篇不說RxJava2 和 Retrofit2的基礎使用,只梳理一下封裝的步驟,所以適合對RxJava2 和 Retrofit2有一定的

Rxjava2+Retrofit2網路框架傻瓜式接入指南

前言 本文主要是介紹本人在專案中接入Rxjava2和Retrofit2的過程中的一些經驗心得、遇到的問題,特別是本人的學習曲線,希望能幫助到你。主要的概念介紹涉及較少,但是在文中會給出我在接入的過程中參考過的文章。 之所以把Rxjava2放在前面是因為,我最開始的時候只想接

Android前端RxJava2+Retrofit2;後端SpringMvc實現圖片上傳

前言 因為前端使用的rxjava+retrofit+mvp的架構進行實現,因此考慮著圖片上傳的功能也直接用rxjava+retrofit去實現,結果在使用過程中,發現始終有問題,圖片上不去;測試了幾天,嘗試更新成rxjava2+retrofit2進行測試

Android RxJava2+Retrofit2 依賴時出現衝突問題

1. 儘管RxJava+ Retrofit很好用,但在一開始學習的時候會踩過很多坑,比如下面這個雖然很簡單但會出現的報錯 。 比如你的app的build.gradle中的dependencies如下所

RxJava2+Retrofit2+RxLifecycle3+OkHttp3網路請求封裝

入職公司後,公司要求元件化開發,經過討論後我將網路請求框架單獨進行了封裝,不過當時框架裡將常用的util和ui均放入到了共同的Common包下,導致裡面部分程式碼耦合,後來為了降低耦合性又將Common拆分為了lib_common和lib_ui,但是lib_ui依賴了lib_common

RxEasyHttp一款基於RxJava2+Retrofit2實現簡單易用的網路請求框架

RxEasyHttp 本庫是一款基於Retrofit2+RxJava2實現簡單易用的網路請求框架,結合android平臺特性的網路封裝庫,採用api鏈式呼叫一點到底,整合cookie管理,多種快取模式,極簡https配置,上傳下載進度顯示,請求錯誤自動重試

【Android】RxJava2+Retrofit2+OkHttp3的基礎、封裝和專案中的使用

前言: 近些年很火的Retrofit+RxJava+OkHttp網路請求框架,功能強大,結構合理,使用簡單方便。後面還會給大家發自己整理過的Retrofit和RxJava、RxAndroid和RxBus。希望大家點一下關注,讓我這個懶癌患者有動力繼續寫下去! 本