Android——MVP+xRecyclerView+Retrofit+OkHttp+RxJava结合应用

一、效果图:

      

二、技能要求:

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

接口:APIKEY=‘71e58b5b2f930eaf1f937407acde08fe

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

三、实现思路

 

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

2. Retrofit访问网络接口获取数据

3. 添加动态代理

4. Rxjava异步处理数据

5. 设置适配器,将数据列表传入适配器

6. 重写适配器的4个方法,并在显示视图的方法中做优化

7. 在构造方法中初始化Fresco并做配置

8. 配置图片的显示方式为圆形显示

9. 在适配器显示视图的方法中通过Fresco来显示图片

添加依赖:

 

  1. compile 'io.reactivex:rxjava:1.3.4'
  2. compile 'io.reactivex:rxandroid:1.2.1'
  3.  
  4. compile 'com.squareup.retrofit2:retrofit:2.3.0'
  5. compile 'com.squareup.retrofit2:converter-gson:2.3.0'
  6. compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
  7. compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0-beta4'
  8.  
  9. compile 'com.squareup.okhttp3:okhttp:3.9.0'
  10. //compile project(':xrecyclerview')
  11.  
  12. compile 'com.facebook.fresco:fresco:0.12.0'//fresco
  13.  
  14. compile 'com.jcodecraeer:xrecyclerview:1.3.2'//xrecyclerview

配置权限:

 

 

  1. <uses-permission android:name="android.permission.INTERNET"/>
  2. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
  3. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  4. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

 

代码:

service接口类

  1. import retrofit2.http.GET;
  2. import retrofit2.http.Query;
  3. import rx.Observable;

  4. /**
  5. * Created by Wangrx on 2017/12/5.
  6. */

  7. public interface BlogService {
  8. @GET("nba/")
  9. Observable<JavaBean> getUrl(@Query("key") String key, @Query("num") int num);
  10. }

RetrofitUtils(封装retrofit网络请求)

 

 

  1. import okhttp3.OkHttpClient;
  2. import retrofit2.Retrofit;
  3. import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
  4. import retrofit2.converter.gson.GsonConverterFactory;
  5.  
  6. /**
  7. * Created by Wangrx on 2017/12/5.
  8. */
  9.  
  10. public class RetrofitUtils {
  11. private static volatile RetrofitUtils instance;
  12. private Retrofit retrofit;
  13.  
  14. private RetrofitUtils(){
  15.  
  16. }
  17. private RetrofitUtils(String baseUrl){
  18. OkHttpClient client = new OkHttpClient();
  19. retrofit = new Retrofit.Builder()
  20. .client(client)
  21. .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
  22. .addConverterFactory(GsonConverterFactory.create())
  23. .baseUrl(baseUrl)
  24. .build();
  25. }
  26. public static RetrofitUtils getInstance(String baseUrl){
  27. if (instance==null){
  28. synchronized (RetrofitUtils.class){
  29. if (null==instance){
  30. instance = new RetrofitUtils(baseUrl);
  31.  
  32. }
  33. }
  34. }
  35. return instance;
  36.  
  37. }
  38. public static RetrofitUtils getInstance(){
  39. if (null == instance){
  40. return getInstance("http://api.tianapi.com/");
  41. }
  42. return instance;
  43. }
  44. public Retrofit getRetrofit(){
  45. return retrofit;
  46. }
  47. }

NewsPresenter(逻辑层)

 

 

  1. import java.util.List;
  2.  
  3. import retrofit2.Retrofit;
  4. import rx.Subscription;
  5. import rx.android.schedulers.AndroidSchedulers;
  6. import rx.functions.Action1;
  7. import rx.schedulers.Schedulers;
  8.  
  9. /**
  10. * Created by Wangrx on 2017/12/5.
  11. */
  12.  
  13. public class NewsPresenter {
  14. private NewsView inv;
  15. private Subscription subscribe;
  16.  
  17. public void attachView(NewsView inv){
  18. this.inv = inv;
  19. }
  20. public void getNews(String key,int num){
  21. Retrofit retrofit = RetrofitUtils.getInstance().getRetrofit();
  22. BlogService service = retrofit.create(BlogService.class);
  23. subscribe = service.getUrl(key, num)
  24. .subscribeOn(Schedulers.io())
  25. .observeOn(AndroidSchedulers.mainThread())
  26. .subscribe(new Action1<JavaBean>() {
  27. @Override
  28. public void call(JavaBean javaBean) {
  29. List<JavaBean.NewslistBean> list = javaBean.getNewslist();
  30. inv.success(list);
  31. }
  32. }, new Action1<Throwable>() {
  33. @Override
  34. public void call(Throwable throwable) {
  35. inv.failed(throwable.getMessage());
  36. }
  37. });
  38.  
  39. }
  40. public void detachView(){
  41. // 当Activity销毁的时候取消订阅时间,防止内存泄漏
  42. if (subscribe != null) {
  43. if (subscribe.isUnsubscribed()) {
  44. subscribe.unsubscribe();
  45. }
  46. }
  47. if (inv!=null){
  48. inv = null;
  49. }
  50. }
  51. }

NewsView(数据接口 成功/失败)

 

 

  1. import java.util.List;
  2.  
  3. /**
  4. * Created by Wangrx on 2017/12/5.
  5. */
  6.  
  7. public interface NewsView {
  8. void success(List<JavaBean.NewslistBean> data);
  9. void failed(String e);
  10. }

MainActivity

 

 

  1. public class MainActivity extends AppCompatActivity {
  2. private List<JavaBean.NewslistBean> list = new ArrayList<>();
  3. private int num=10;
  4. private NewsPresenter presenter;
  5. private MyAdapter adapter;
  6. private XRecyclerView xRecyclerView;
  7.  
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.activity_main);
  12. xRecyclerView = (XRecyclerView) findViewById(R.id.recyclerview);
  13. LinearLayoutManager layoutManager = new LinearLayoutManager(this);
  14. layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
  15. xRecyclerView.setLayoutManager(layoutManager);
  16. Fresco.initialize(this);
  17.  
  18. getData(num);
  19.  
  20. xRecyclerView.setPullRefreshEnabled(true);
  21. xRecyclerView.setLoadingMoreEnabled(true);
  22. xRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
  23. xRecyclerView.setLoadingMoreProgressStyle(ProgressStyle.Pacman);
  24.  
  25. xRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
  26. @Override
  27. public void onRefresh() {
  28. new Handler().postDelayed(new Runnable(){
  29. public void run() {
  30. num=10;
  31. getData(num);
  32. xRecyclerView.refreshComplete();
  33. }
  34.  
  35. }, 2000);
  36.  
  37. }
  38.  
  39. @Override
  40. public void onLoadMore() {
  41. new Handler().postDelayed(new Runnable(){
  42. public void run() {
  43. num+=10;
  44. getData(num);
  45. xRecyclerView.refreshComplete();
  46. }
  47. }, 2000);
  48.  
  49. }
  50. });
  51. }
  52. public void getData(int count){
  53. presenter = new NewsPresenter();
  54. presenter.getNews("71e58b5b2f930eaf1f937407acde08fe", count);
  55. presenter.attachView(new NewsView() {
  56. @Override
  57. public void success(List<JavaBean.NewslistBean> data) {
  58. list.clear();
  59. list.addAll(data);
  60. Log.i("zzz", "success: " + list.toString());
  61. if (adapter==null){
  62. adapter = new MyAdapter(list, MainActivity.this);
  63. xRecyclerView.setAdapter(adapter);
  64. }else {
  65. adapter.notifyDataSetChanged();
  66. }
  67.  
  68. }
  69.  
  70. @Override
  71. public void failed(String e) {
  72.  
  73. }
  74. });
  75. }
  76.  
  77. @Override
  78. protected void onDestroy() {
  79. super.onDestroy();
  80. if (presenter!=null){
  81. presenter.detachView();
  82. }
  83.  
  84. }
  85. }

MyAdapter(适配器)

 

 

  1. /**
  2. * Created by Wangrx on 2017/12/5.
  3. */

  4. public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
  5. private List<JavaBean.NewslistBean> datas;
  6. private Context context;


  7. public MyAdapter(List<JavaBean.NewslistBean> datas, Context context) {
  8. this.datas = datas;
  9. this.context = context;
  10. }

  11. //创建新View,被LayoutManager所调用
  12. @Override
  13. public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
  14. View view = View.inflate(context, R.layout.item, null);
  15. ViewHolder vh = new ViewHolder(view);
  16. return vh;
  17. }

  18. //将数据与界面进行绑定的操作
  19. @Override
  20. public void onBindViewHolder(ViewHolder viewHolder, int position) {
  21. viewHolder.item_img.setImageURI(datas.get(position).getPicUrl());
  22. viewHolder.mTextView.setText(datas.get(position).getTitle());
  23. }

  24. //获取数据的数量
  25. @Override
  26. public int getItemCount() {
  27. return datas.size();
  28. }

  29. //自定义的ViewHolder,持有每个Item的的所有界面元素
  30. public static class ViewHolder extends RecyclerView.ViewHolder {
  31. public TextView mTextView;
  32. private SimpleDraweeView item_img;
  33. public ViewHolder(View view) {
  34. super(view);
  35. mTextView = (TextView) view.findViewById(R.id.text);
  36. item_img = view.findViewById(R.id.item_img);
  37. }
  38. }
  39. }


 

fresco

 

  1. <com.facebook.drawee.view.SimpleDraweeView
  2. android:id="@+id/item_img"
  3. android:layout_width="120dp"
  4. android:layout_height="120dp"
  5. fresco:roundAsCircle="true"
  6. fresco:placeholderImage="@mipmap/ic_launcher"/>

 

--------------------- 本文来自 xy8199 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/xy8199/article/details/78726678?utm_source=copy

posted @ 2018-10-08 14:22  天涯海角路  阅读(303)  评论(0)    收藏  举报