MVP+xRecyclerView+Retrofit+OkHttp+RxJava


1.     如上图,使用 MVP+xRecyclerView+Retrofit+OkHttp+RxJava

接口:APIKEY=71e58b5b2f930eaf1f937407acde08fe

http://api.tianapi.com/nba/?key=APIKEY&num=10

2.  实现思路:

1.   主页面显示一个xRecycleveiw实现分页加载(10分)

2.   Retrofit访问网络接口获取数据(10分)

3.   xRecycleview 实现多条目展示上面效果(10分)

4.   MVP分层(10分)P调M(5分)V实现P(5分)

5.   自定义搜索框(10分)

6.   在构造方法中初始化Fresco并做配置(10分)

7.   配置图片的显示方式为圆形显示(10分)

8.   在适配器显示视图的方法中通过Fresco来显示图片(10分)



主布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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.com.jinjieer.view.MainActivity">

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

 </com.jcodecraeer.xrecyclerview.XRecyclerView>

</RelativeLayout>

子布局


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal"
    android:layout_height="match_parent">
<com.facebook.drawee.view.SimpleDraweeView
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_margin="10dp"
    fresco:roundedCornerRadius="20dp"
    android:id="@+id/sdv"
    android:layout_gravity="center"/>
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tv"
    android:layout_gravity="center"/>
</LinearLayout>


依赖

compile 'io.reactivex:rxjava:1.3.4'
compile 'io.reactivex:rxandroid:1.2.1'

compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0-beta4'

//compile project(':xrecyclerview')

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

compile 'com.jcodecraeer:xrecyclerview:1.3.2'//xrecyclerview
compile 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'


权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
android:name=".application.MyApplication"


activity

package com.example.com.jinjieer.view;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.util.Log;
import android.widget.ProgressBar;

import com.example.com.jinjieer.R;
import com.example.com.jinjieer.adapter.MyrecyAdapter;
import com.example.com.jinjieer.model.Data;
import com.example.com.jinjieer.model.DataBean;
import com.example.com.jinjieer.presenter.MyDataPresenter;
import com.jcodecraeer.xrecyclerview.ProgressStyle;
import com.jcodecraeer.xrecyclerview.XRecyclerView;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class MainActivity extends AppCompatActivity implements DataView{

    @BindView(R.id.xre)
    XRecyclerView xre;
    private String api = "http://api.tianapi.com/";
    private int num=15;
    private List<Data> list = new ArrayList<>();
    private MyrecyAdapter myrecyAdapter;
    private MyDataPresenter dataPresenter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ButterKnife.bind(this);

        init();

        dataPresenter = new MyDataPresenter(this);

        //dataPresenter.toDataUrl(api,10);

        getBean();
    }

    private void init() {

        xre.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));

        xre.setPullRefreshEnabled(true);
        xre.setLoadingMoreEnabled(true);

        xre.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
        xre.setLoadingMoreProgressStyle(ProgressStyle.Pacman);

        xre.setLoadingListener(new XRecyclerView.LoadingListener() {
            @Override
            public void onRefresh() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        num = 15;

                        getBean();

                        getAdapter();

                        xre.refreshComplete();
                    }
                },2000);




            }

            @Override
            public void onLoadMore() {

                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        num += 10;

                        getBean();

                        getAdapter();

                        xre.refreshComplete();
                    }
                },2000);

            }
        });

    }

    public void getBean(){
        dataPresenter.toDataUrl(api,num);
    }

    @Override
    public void getData(Object o) {
        DataBean<List<Data>> dataBean= (DataBean<List<Data>>) o;
        Log.d("----", "getData: "+dataBean.getData().size());
        List<Data> data = dataBean.getData();

        list.clear();

        list.addAll(data);

        getAdapter();
    }

    void getAdapter(){
        if(myrecyAdapter == null){
            myrecyAdapter = new MyrecyAdapter(MainActivity.this, list);
            xre.setAdapter(myrecyAdapter);
        }else{
            myrecyAdapter.notifyDataSetChanged();
        }

    };
}


DataView

package com.example.com.jinjieer.view;

/**
 * Created by linmeihui on 2018/4/18.
 */

public interface DataView {
    void getData(Object o);
}


DataModel

package com.example.com.jinjieer.model;

import com.example.com.jinjieer.presenter.DataPresenter;

/**
 * Created by linmeihui on 2018/4/18.
 */

public interface DataModel {
    void toDataUrl(String url, int num, DataPresenter presenter);
}


MyDataModel


package com.example.com.jinjieer.model;


import android.util.Log;

import com.example.com.jinjieer.api.APIService;
import com.example.com.jinjieer.presenter.DataPresenter;

import java.util.List;

import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observer;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

/**
 * Created by linmeihui on 2018/4/18.
 */

public class MyDataModel implements DataModel{

    @Override
    public void toDataUrl(String url, int num, final DataPresenter presenter) {

        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

        APIService apiService = retrofit.create(APIService.class);

        apiService.getBeanen("71e58b5b2f930eaf1f937407acde08fe", num)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<DataBean<List<Data>>>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        presenter.onFailed(e.getMessage());
                    }

                    @Override
                    public void onNext(DataBean<List<Data>> dataDataBean) {
                        Log.d("--", "onNext: "+dataDataBean.getData().size());
                        presenter.onSuccess(dataDataBean);
                    }
                });




    }
}


DataPresenter

package com.example.com.jinjieer.presenter;

/**
 * Created by linmeihui on 2018/4/18.
 */

public interface DataPresenter {

    void onSuccess(Object o);
    void onFailed(String e);

}

 

MyDataPresenter

package com.example.com.jinjieer.presenter;

import com.example.com.jinjieer.model.DataModel;
import com.example.com.jinjieer.model.MyDataModel;
import com.example.com.jinjieer.view.DataView;

/**
 * Created by linmeihui on 2018/4/18.
 */

public class MyDataPresenter implements DataPresenter {
    private DataView dataview;
    private DataModel dataModel;

    public MyDataPresenter(DataView dataView) {

        this.dataview=dataView;
        dataModel=new MyDataModel();

    }

    @Override
    public void onSuccess(Object o) {
        dataview.getData(o);
    }

    @Override
    public void onFailed(String e) {

    }
    public void toDataUrl(String url,int num){
        dataModel.toDataUrl(url,num,this);
    }
}


ApiService

package com.example.com.jinjieer.api;



import com.example.com.jinjieer.model.Data;
import com.example.com.jinjieer.model.DataBean;

import java.util.List;

import retrofit2.http.GET;
import retrofit2.http.Query;
import rx.Observable;

/**
 * Created by linmeihui on 2018/4/18.
 */

public interface   APIService {
    @GET("nba/")
    Observable<DataBean<List<Data>>> getBeanen(@Query("key") String key, @Query("num") int num);

}

 

DataBean

package com.example.com.jinjieer.model;

import java.util.List;

/**
 * Created by linmeihui on 2018/4/18.
 */

public class DataBean <T>{
    private int code;
    private String msg;
    private  T newslist;

    //List<D>

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return newslist;
    }

    public void setData(T newslist) {
        this.newslist = newslist;
    }
}




Data

package com.example.com.jinjieer.model;

/**
 * Created by linmeihui on 2018/4/18.
 */

public class Data {

    /**
     * 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
     */

    private String ctime;
    private String title;
    private String description;
    private String picUrl;
    private String 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;
    }
}


Application

package com.example.com.jinjieer.application;

import android.app.Application;

import com.facebook.drawee.backends.pipeline.Fresco;

/**
 * Created by linmeihui on 2018/4/19.
 */

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



MyAdapter

package com.example.com.jinjieer.adapter;

import android.content.Context;
import android.net.Uri;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.example.com.jinjieer.R;
import com.example.com.jinjieer.model.Data;
import com.facebook.drawee.view.SimpleDraweeView;
import com.jcodecraeer.xrecyclerview.XRecyclerView;

import java.util.List;

/**
 * Created by linmeihui on 2018/4/19.
 */

public class MyrecyAdapter extends XRecyclerView.Adapter {

    private Context context;
    private List<Data> list;

    public MyrecyAdapter(Context context, List<Data> list) {
        this.context = context;
        this.list = list;
    }


    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view=View.inflate(context,R.layout.item,null);
        ViewHolder viewHolder=new ViewHolder(view);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        ViewHolder viewHolder= (ViewHolder) holder;
        viewHolder.sdv.setImageURI(Uri.parse(list.get(position).getPicUrl()));
        viewHolder.tv.setText(list.get(position).getTitle());



    }

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


    class ViewHolder extends XRecyclerView.ViewHolder{

        private final SimpleDraweeView sdv;
        private final TextView tv;

        public ViewHolder(View itemView) {
            super(itemView);

            sdv = itemView.findViewById(R.id.sdv);
            tv = itemView.findViewById(R.id.tv);

        }
    }
}





猜你喜欢

转载自blog.csdn.net/ch5211314/article/details/80009947