MVP模式的請求數據

此貼用到的模塊有Rxjava觀察者模式+Retrofit請求GSON數據+Fresco處理圖片+Xrecyclerview展現數據+MVP模式,廢話很少說,看效果直接上代碼!java

效果以下:react


 

 

相關依賴以下:android

 

// xrecyclerview的依賴
compile 'com.jcodecraeer:xrecyclerview:1.3.2'

// fresco
compile 'com.facebook.fresco:fresco:0.12.0'

// Retrofit庫
compile 'com.squareup.retrofit2:retrofit:2.0.1'
// Okhttp庫
compile 'com.squareup.okhttp3:okhttp:3.1.2'

// rxjava+rxandroid+retrofit2+okhttp
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
compile 'com.squareup.retrofit2:converter-gson:2.0.1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

 

 

 


 

MyAppapi

 

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}

 

 

API 網絡

 

public class API {
    public static final String URL = "http://api.expoon.com";
}

 

 

ApiServiceiview

 

public interface ApiService {
    @GET("/ AppNews/getNewsList/type/1/p/1")
    Observable<NewsBean> getData();
}

 

 

model層ide

 

public interface IMOdel {

    // 處理數據的方法
    void GetData();
}

 

 

 

public class UserModel implements IMOdel {

    // 建立集合 保存請求下來的數據
    ArrayList<NewsBean.DataBean> lists;

    private OnFinish onFinish;

    public UserModel(OnFinish onFinish) {
        this.onFinish = onFinish;
    }

    // 建立接口
    public interface OnFinish{
        void onFinishLinisher(ArrayList<NewsBean.DataBean> lists);
    }

    @Override
    public void GetData() {
        lists = new ArrayList<>();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(API.URL)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        // 經過動態代理得到網絡接口數據
        ApiService apiService = retrofit.create(ApiService.class);
        Observable<NewsBean> data = apiService.getData();
        // 設置請求數據時候的線程
        data.subscribeOn(Schedulers.io())
                // 設置請求結束後的線程
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<NewsBean>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(NewsBean newsBean) {
                        Log.d("main2", "onNext: " + newsBean.getData() + "----");
                        lists = (ArrayList<NewsBean.DataBean>) newsBean.getData();
                        onFinish.onFinishLinisher(lists);
                    }
                });
    }
}

 

 

view層佈局

 

public interface Iview {
    // 展現數據的方法
    void ShowData(ArrayList<NewsBean.DataBean> lists);
}

 

 

 

presenter層ui

 

public class UserPresenter implements UserModel.OnFinish {
    private final Iview iview;
    private final UserModel userModel;

    public UserPresenter(Iview iview) {
        this.iview = iview;
        userModel = new UserModel(this);
    }

    // 處理model與view的邏輯
    public void getData(){
        userModel.GetData();
    }

    @Override
    public void onFinishLinisher(ArrayList<NewsBean.DataBean> lists) {
        iview.ShowData(lists);
    }
}

 

 

bean類 這裏的一大段用Gsonformat就能夠一步搞定了!this

 

public class NewsBean {

    /**
     * status : 1
     * info : 獲取內容成功
     * data : [{"news_id":"13811","news_title":"深港澳臺千里連線,嘉年華會今夏入川","news_summary":"6月17\u201420日,\u201c2016成都深港澳臺嘉年華會\u201d(簡稱嘉年華會)將在成都世紀城國際會展中心舉辦。其主辦方勵展華博借力旗","pic_url":"http://f.expoon.com/sub/news/2016/01/21/887844_230x162_0.jpg"},{"news_id":"13810","news_title":"第14屆溫州國際汽車展4月舉行 設9大主題展館","news_summary":"來自前不久舉行的溫州國際汽車展覽會第一次新聞發佈會的消息, 2016第14屆溫州國際汽車展覽會定於4月7-10日在溫州國","pic_url":"http://f.expoon.com/sub/news/2016/01/21/580828_230x162_0.jpg"},{"news_id":"13808","news_title":"第十二屆中國(南安)國際水暖泵閥交易會 四大亮點","news_summary":"第十二屆中國(南安)國際水暖泵閥交易會將於2月10日至12日(即農曆正月初三至初五)在成功國際會展中心拉開帷幕。","pic_url":"http://f.expoon.com/sub/news/2016/01/21/745921_230x162_0.jpg"},{"news_id":"13805","news_title":"2016上海燈光音響展 商機無限,一觸即發","news_summary":"2016上海國際專業燈光音響展即日起全面啓動,海內外高端演藝設備商貿平臺,商機無限,一觸即發。6大洲,80個國家,25,","pic_url":"http://f.expoon.com/sub/news/2016/01/21/158040_230x162_0.jpg"},{"news_id":"13804","news_title":"第四屆南京國際佛事展5月舉行","news_summary":"2016年,\u201c第四屆南京國際佛事文化用品展覽會\u201d將於5月26-29日在南京國際展覽中心舉辦。","pic_url":"http://f.expoon.com/sub/news/2016/01/21/865222_230x162_0.jpg"},{"news_id":"13802","news_title":"上海國際牛仔服裝博覽會 拓展國際貿易大市場","news_summary":"2016年第三屆上海國際牛仔服裝博覽會將於4月19-21日再次璀璨再現上海世博展覽館,共同探討牛仔流行趨勢,詮釋牛仔文化","pic_url":"http://f.expoon.com/sub/news/2016/01/20/370858_230x162_0.jpg"},{"news_id":"13800","news_title":"第三屆蘭州年貨會在甘肅國際會展中心本月19日開幕","news_summary":"由中國商業聯合會、甘肅省商業聯合會、蘭州市商務局主辦,甘肅省酒類商品管理局、蘭州市城關區商務局、第十四屆西安年貨會組委會","pic_url":"http://f.expoon.com/sub/news/2016/01/20/868385_230x162_0.jpg"},{"news_id":"13799","news_title":"首屆移動拍賣藝術博覽會啓動","news_summary":"首屆移動拍賣博覽會已於2016年1月全面啓動,由大咖拍賣主辦,聯合全國藝術機構共同打造拍賣藝術博覽會主會場,近百場拍賣專","pic_url":"http://f.expoon.com/sub/news/2016/01/20/768695_230x162_0.jpg"},{"news_id":"13798","news_title":"武漢金融理財投資博覽會將在5月舉辦","news_summary":"由武漢市貿促會、上海《理財週刊》社、湖北好博塔蘇斯展覽有限公司等單位聯合發起的\u201c2016武漢金融理財投資博覽會\u201d,將在武","pic_url":"http://f.expoon.com/sub/news/2016/01/20/512947_230x162_0.jpg"},{"news_id":"13796","news_title":"第三屆中國微商博覽會 3月底濟南舉辦","news_summary":"2015年,沸點天下開創了微商行業第一個展會\u2014\u2014中國微商博覽會,並於2015年成功舉行兩屆,讓微商展會從無到有,而且起了","pic_url":"http://f.expoon.com/sub/news/2016/01/20/348021_230x162_0.jpg"},{"news_id":"13793","news_title":"2016中國西部國際絲綢博覽會","news_summary":"\u201c2016年中國西部國際絲綢博覽會\u201d最新肯定於2016年5月11日至15日在南充舉行。據悉,\u201c絲博會\u201d的會徽、會標及宣傳","pic_url":"http://f.expoon.com/sub/news/2016/01/19/113912_230x162_0.jpg"},{"news_id":"13792","news_title":"中國針棉織品交易會開拓\u201c西部市場\u201d","news_summary":"由國家商務部重點支持、中國紡織品商業協會主辦的第98屆中國針棉織品交易會將於3月15日~17日綻開成都。做爲中國國內針棉","pic_url":"http://f.expoon.com/sub/news/2016/01/19/650175_230x162_0.jpg"},{"news_id":"13791","news_title":"樂山市第二十屆房地產展現交易會開幕","news_summary":"美麗樂山,生態宜居。今日,樂山市第二十屆房地產展現交易會在該市中心城區樂山廣場開幕,展會將持續到1月24日。","pic_url":"http://f.expoon.com/sub/news/2016/01/19/321787_230x162_0.jpg"},{"news_id":"13790","news_title":"2016華中屋面與建築防水技術展3月即將開幕","news_summary":"由湖北省建築防水協會聯合湖南、河南、江西、安徽五省建築防水協會主辦\u201c2016第二屆華中屋面與建築防水技術展覽會\u201d將於20","pic_url":"http://f.expoon.com/sub/news/2016/01/19/376254_230x162_0.jpg"},{"news_id":"13789","news_title":"2016海南國際旅遊貿易博覽會召開新聞發佈會","news_summary":"近日,三亞旅遊官方網從海南省\u201c首屆海博會\u201d新聞發佈會上獲悉,海南省\u201c首屆海博會\u201d將於2016年3月26日至4月1日在三亞","pic_url":"http://f.expoon.com/sub/news/2016/01/19/958046_230x162_0.jpg"},{"news_id":"13788","news_title":"2016阿里巴巴·貴州年貨節展銷會開幕","news_summary":"\u201c2016阿里巴巴·貴州年貨節\u201d的展銷會及迎春廟會昨日啓動。150多家餐飲商參與的美食節、近千個品種組成的年貨展銷會等,","pic_url":"http://f.expoon.com/sub/news/2016/01/19/371688_230x162_0.jpg"},{"news_id":"13787","news_title":"第二屆中國盆栽花卉交易會\u200b 本月28日開幕","news_summary":"據廣州市政府獲悉,經中國花卉協會和廣州市政府批准,第二屆中國盆栽花卉交易會將於本月28日至31日在廣州花卉博覽園舉行。屆","pic_url":"http://f.expoon.com/sub/news/2016/01/18/687647_230x162_0.jpg"},{"news_id":"13786","news_title":"李益:視野、品質、融合是展覽工程國際化的必由路徑","news_summary":"\u201c視野、品質、融合是中國展覽工程走向國際化的必由路徑。\u201d北京逸格天驕國際展覽有限公司副總經理李益日前在第二十二屆國際(常","pic_url":"http://f.expoon.com/sub/news/2016/01/18/343556_230x162_0.jpg"},{"news_id":"13785","news_title":"第八屆中國國際集成住宅產業博覽會將於5月在廣州舉辦","news_summary":"2016年1月14日,第八屆中國(廣州)國際集成住宅產業博覽會暨2016亞太建築科技論壇\u2014\u2014新聞發佈會在廣州館隆重召開。","pic_url":"http://f.expoon.com/sub/news/2016/01/18/581830_230x162_0.jpg"},{"news_id":"13784","news_title":"絲綢之路敦煌國際文化博覽會籌備工做進展順利","news_summary":"近日,絲綢之路(敦煌)國際文化博覽會組委會第二次會議在蘭召開。會議研究討論了省直廳局一對一服務保障沿線省區市方案、文博會","pic_url":"http://f.expoon.com/sub/news/2016/01/18/656693_230x162_0.jpg"}]
     */
private int status;
    private String info;
    private List<DataBean> data;

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public List<DataBean> getData() {
        return data;
    }

    public void setData(List<DataBean> data) {
        this.data = data;
    }

    public static class DataBean {
        /**
         * news_id : 13811
         * news_title : 深港澳臺千里連線,嘉年華會今夏入川
         * news_summary : 6月17—20日,「2016成都深港澳臺嘉年華會」(簡稱嘉年華會)將在成都世紀城國際會展中心舉辦。其主辦方勵展華博借力旗
         * pic_url : http://f.expoon.com/sub/news/2016/01/21/887844_230x162_0.jpg
         */
private String news_id;
        private String news_title;
        private String news_summary;
        private String pic_url;

        public DataBean(String news_title, String pic_url) {
            this.news_title = news_title;
            this.pic_url = pic_url;
        }

        public String getNews_id() {
            return news_id;
        }

        public void setNews_id(String news_id) {
            this.news_id = news_id;
        }

        public String getNews_title() {
            return news_title;
        }

        public void setNews_title(String news_title) {
            this.news_title = news_title;
        }

        public String getNews_summary() {
            return news_summary;
        }

        public void setNews_summary(String news_summary) {
            this.news_summary = news_summary;
        }

        public String getPic_url() {
            return pic_url;
        }

        public void setPic_url(String pic_url) {
            this.pic_url = pic_url;
        }
    }
}

 

 

MainActivity

 

public class MainActivity extends AppCompatActivity implements Iview {

    XRecyclerView xr;
    UserPresenter presenter;
    MyXrecyclerviewAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化
        init();

    }

    private void init() {
        xr = (XRecyclerView) findViewById(R.id.xr);

        // 初始化數據
        initData();

        // 上拉刷新 下拉加載
        xr.setLoadingMoreEnabled(true);
        xr.setPullRefreshEnabled(true);

        // 監聽事件就不作了 具體需求自定義便可
        xr.setLoadingListener(new XRecyclerView.LoadingListener() {
            @Override
            public void onRefresh() {
                xr.refreshComplete();
                Toast.makeText(MainActivity.this,"下拉刷新",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onLoadMore() {
                xr.loadMoreComplete();
                Toast.makeText(MainActivity.this,"上拉加載",Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void initData() {
        presenter = new UserPresenter(this);
        presenter.getData();
    }

    @Override
    public void ShowData(ArrayList<NewsBean.DataBean> lists) {
        xr.setLayoutManager(new LinearLayoutManager(this));
        xr.setAdapter(adapter = new MyXrecyclerviewAdapter(lists,this));
    }
}

 

 

Xrecyclerview的適配器

 

public class MyXrecyclerviewAdapter  extends RecyclerView.Adapter<MyXrecyclerviewAdapter.MyViewHolder> {

    // 數據源
    ArrayList<NewsBean.DataBean> lists;
    // 上下文
    Context context;

    public MyXrecyclerviewAdapter(ArrayList<NewsBean.DataBean> lists, Context context) {
        this.lists = lists;
        this.context = context;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.recy_item, parent,
                false));
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position)
    {
        holder.tv.setText(lists.get(position).getNews_title());
        Uri uri = Uri.parse(lists.get(position).getPic_url());
        holder.img.setImageURI(uri);
    }

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

    class MyViewHolder extends ViewHolder
    {

        TextView tv;
        SimpleDraweeView img;

        public MyViewHolder(View view)
        {
            super(view);
            tv =  view.findViewById(R.id.recy_item_tv);
            img = view.findViewById(R.id.recy_item_img);
        }
    }
}

 

 

最後附上xml佈局文件

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.administrator.mvprxjavaretrofit_demo.MainActivity">

    <com.jcodecraeer.xrecyclerview.XRecyclerView
        android:id="@+id/xr"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

 

 

recy_item的佈局

 

<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_margin="10dp"
    android:background="#737373"
    android:layout_height="wrap_content"
    android:orientation="horizontal">


    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/recy_item_img"
        android:layout_width="100dp"
        android:layout_height="100dp"
        fresco:placeholderImage="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/recy_item_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="標題" />
</LinearLayout>

 

 

 

注:xrecyclerview和recyclerview的用法同樣,用法請參考http://blog.csdn.net/xsf50717/article/details/51366922

       

Gsonformat安裝方法 
方法一:

1.Android studio File->Settings..->Plugins–>Browse repositores..搜索GsonFormat 
2.安裝插件,重啓android studio

方法二:

1.下載GsonFormat.jar ; 
2.Android studio File->Settings..->Plugins –>install plugin from disk..導入下載GsonFormat.jar 
3.重啓android studio

使用方法 
在實體類中使用Generate的快捷鍵. 

 

Rxjava2和Rectro2依賴若是出現衝突請參考:

 

緣由是使用了rxjava2, compile"io.reactivex.rxjava2:rxjava:2.0.7"
可是retrofit2一開始是基於rxjava開發的適配器即adapter-rxjava,

這個適配器只適合rxjava,若是想使用rxjava2就得使用adapter-rxjava2適配器
這個適配器有兩個

一個是retrofit2官方設計的(上線不久),

另一個就是jakewharton大神弄出來的retrofit2-rxjava2-adapter適配器。


因此把compile "com.squareup.retrofit2:adapter-rxjava:2.2.0"

改爲 compile "com.squareup.retrofit2:adapter-rxjava2:2.2.0"

就能夠了。

注意:若是設置了

build.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//這裏的RxJavaCallAdapterFactory要換成RxJava2CallAdapterFactory
相關文章
相關標籤/搜索