1. 程式人生 > >Retrofit+OkHttpClient+Fresco+XRecyclerView+RxJava實現資料展示

Retrofit+OkHttpClient+Fresco+XRecyclerView+RxJava實現資料展示

需要的依賴包
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'io.reactivex:rxjava:1.0.14'
compile 'io.reactivex:rxandroid:1.0.1'
// Okhttp庫
compile 'com.squareup.okhttp3:okhttp:3.1.2'
compile 'com.facebook.fresco:fresco:1.5.0'
compile 'com.android.support:recyclerview-v7:26.1.0' compile 'com.jcodecraeer:xrecyclerview:1.3.2'
初始化App-載入圖片並註冊(清單檔案)
public class MyApp extends Application {
    @Override
public void onCreate() {
        super.onCreate();
        Fresco.initialize(this);
    }
}
失敗和成功回撥的介面
public interface OnNetListener<T
> { public void onSuccess(T t); public void onFailure(Exception e); }
Api-網路請求地址
public class Api {
    public static final String HOST = "http://api.tianapi.com/nba/";
    public static final String URL = "?key=71e58b5b2f930eaf1f937407acde08fe&num=10";
}
ServerApi-Retrofit需要用到的介面
public interface 
ServerApi { @GET(Api.URL) Observable<ClassBean> call(); }
Retrofit的工具類-建立OkHttpClient和ServerApi請求
public class RetrofitHelper {
    public static OkHttpClient client;
    public static ServerApi serverApi;
    static {
        getClient();
    }

    public static OkHttpClient getClient() {
        if (client == null){
            synchronized (OkHttpClient.class){
                if (client == null){
                    client = new OkHttpClient();
                }
            }
        }
        return client;
    }
    public static ServerApi getServerApi(){
        if (serverApi == null){
            synchronized (ServerApi.class){
                if (serverApi == null){
                    serverApi = OnCreate(ServerApi.class,Api.HOST);
                }
            }
        }
        return serverApi;
    }
    public static <T> T OnCreate(Class<T> tClass,String url){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        return retrofit.create(tClass);
    }
}
bean類--網路請求介面的資料
public class ClassBean {
    private int code;
    private String msg;
    private List<NewslistBean> newslist;

    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 List<NewslistBean> getNewslist() {
        return newslist;
    }

    public void setNewslist(List<NewslistBean> newslist) {
        this.newslist = newslist;
    }

    public static class NewslistBean {
        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;
        }
    }
}
Model層的資料,請求資料
public class MainModel implements IMainModel {
    @Override
public void recy(final OnNetListener<ClassBean> bean) {
        ServerApi serverApi = RetrofitHelper.getServerApi();
        serverApi.call()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<ClassBean>() {
                    @Override
public void onCompleted() {

                    }

                    @Override
public void onError(Throwable e) {

                    }

                    @Override
public void onNext(ClassBean classBean) {
                        bean.onSuccess(classBean);
                    }
                });
    }
}
model層對應的介面
public interface IMainModel {
    public void recy(OnNetListener<ClassBean> bean);
}
presenter層--view和model的互動層
public class MainPresenter {
    public IMainModel iMainModel;
    public IMainActivity iMainActivity;

    public MainPresenter(IMainActivity iMainActivity) {
        this.iMainActivity = iMainActivity;
        iMainModel = new MainModel();
    }
    public void getData(){
        iMainModel.recy(new OnNetListener<ClassBean>() {
            @Override
public void onSuccess(ClassBean classBean) {
                iMainActivity.showrecy(classBean);
            }

            @Override
public void onFailure(Exception e) {

            }
        });
    }
    public void getMore(){
        iMainModel.recy(new OnNetListener<ClassBean>() {
            @Override
public void onSuccess(ClassBean classBean) {
                iMainActivity.showrecys(classBean);
            }

            @Override
public void onFailure(Exception e) {

            }
        });
    }
}
view層--展示資料的Activity
public class MainActivity extends AppCompatActivity implements IMainActivity {

    private MainPresenter mainPresenter = new MainPresenter(this);
    private XRecyclerView mXrv;
    private List<ClassBean.NewslistBean> list;
    private RvAdapter adapter;

    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        ActionBar bar = getSupportActionBar();
        bar.hide();
        mainPresenter.getData();
        mXrv.setLayoutManager(new LinearLayoutManager(this));
        //下拉重新整理上拉載入
mXrv.setLoadingListener(new XRecyclerView.LoadingListener() {
            //重新整理
@Override
public void onRefresh() {
                mainPresenter.getData();
                mXrv.refreshComplete();
            }
            //載入更多
@Override
public void onLoadMore() {
                mainPresenter.getMore();
                mXrv.refreshComplete();
            }
        });
    }
    private void initView() {
        mXrv = findViewById(R.id.xrv);
    }
    //展示資料
@Override
public void showrecy(final ClassBean bean) {
        runOnUiThread(new Runnable() {
            @Override
public void run() {
                list = bean.getNewslist();
                adapter = new RvAdapter(MainActivity.this, list);
                mXrv.setAdapter(adapter);
            }
        });
    }
    //載入更多
@Override
public void showrecys(ClassBean bean) {
        list.addAll(bean.getNewslist());
        adapter.notifyDataSetChanged();
    }
}
view層的Activity的介面
public interface IMainActivity {
    public void  showrecy(ClassBean bean);
    public void  showrecys(ClassBean bean);
}
RecyclerView的介面卡
public class RvAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context context;
    private List<ClassBean.NewslistBean> list;

    public RvAdapter(Context context, List<ClassBean.NewslistBean> 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);
        return new MyViewHolder(view);
    }

    @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        MyViewHolder holder1 = (MyViewHolder) holder;
        ClassBean.NewslistBean bean = list.get(position);
        holder1.sdv.setImageURI(bean.getPicUrl());
        holder1.tv.setText(bean.getTitle());
    }

    @Override
public int getItemCount() {
        return list.size();
    }
    class MyViewHolder extends RecyclerView.ViewHolder{
        private SimpleDraweeView sdv;
        private TextView tv;
        public MyViewHolder(View itemView) {
            super(itemView);
            sdv = itemView.findViewById(R.id.sdv);
            tv = itemView.findViewById(R.id.tv1);
        }
    }
}