Retrofit+OkHttpClient+Fresco+XRecyclerView+RxJava實現資料展示
阿新 • • 發佈:2019-01-27
需要的依賴包
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 interfaceServerApi { @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); } } }