依赖
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 'com.squareup.okhttp3:okhttp:3.9.0' //compile project(':xrecyclerview') compile 'com.facebook.fresco:fresco:0.12.0'//fresco compile 'com.jcodecraeer:xrecyclerview:1.3.2'//xrecyclerview
权限
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
布局
activity—main
<?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="bwei.com.wanghongyun20180421.MainActivity"> <com.jcodecraeer.xrecyclerview.XRecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recyclerview"> </com.jcodecraeer.xrecyclerview.XRecyclerView> </RelativeLayout>item
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:fresco="http://schemas.android.com/apk/res-auto"> <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/item_img" android:layout_width="120dp" android:layout_height="120dp" fresco:roundAsCircle="true" fresco:placeholderImage="@mipmap/ic_launcher" /> <TextView android:layout_width="match_parent" android:layout_height="120dp" android:id="@+id/text" android:layout_toRightOf="@id/item_img"/> </RelativeLayout>
逻辑代码,从上往下
My'Adapter
package bwei.com.wanghongyun20180421.adapter; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.facebook.drawee.view.SimpleDraweeView; import java.util.List; import bwei.com.wanghongyun20180421.R; import bwei.com.wanghongyun20180421.bean.JavaBean; /** * Created by why on 2018/4/21. */ public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<JavaBean.NewslistBean> datas; private Context context; public MyAdapter(List<JavaBean.NewslistBean> datas, Context context) { this.datas = datas; this.context = context; } //创建新View,被LayoutManager所调用 @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View view = View.inflate(context, R.layout.item, null); ViewHolder vh = new ViewHolder(view); return vh; } //将数据与界面进行绑定的操作 @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { viewHolder.item_img.setImageURI(datas.get(position).getPicUrl()); viewHolder.mTextView.setText(datas.get(position).getTitle()); } //获取数据的数量 @Override public int getItemCount() { return datas.size(); } //自定义的ViewHolder,持有每个Item的的所有界面元素 public static class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; private SimpleDraweeView item_img; public ViewHolder(View view) { super(view); mTextView = (TextView) view.findViewById(R.id.text); item_img = view.findViewById(R.id.item_img); } } }
JavaBean
APIKEY=‘71e58b5b2f930eaf1f937407acde08fe’
http://api.tianapi.com/nba/?key=APIKEY&num=10
BolgService
package bwei.com.wanghongyun20180421.callbback; import bwei.com.wanghongyun20180421.bean.JavaBean; import retrofit2.http.GET; import retrofit2.http.Query; import rx.Observable; /** * Created by why on 2018/4/21. */ public interface BolgService { @GET("nba/") Observable<JavaBean> getUrl(@Query("key") String key, @Query("num") int num); }
NewsView
package bwei.com.wanghongyun20180421.callbback; import java.util.List; import bwei.com.wanghongyun20180421.bean.JavaBean; /** * Created by why on 2018/4/21. */ public interface NewsView { void success(List<JavaBean.NewslistBean> data); void failed(String e); }
RetrofitUtils
package bwei.com.wanghongyun20180421.httputils; import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; /** * Created by why on 2018/4/21. */ public class RetrofitUtils { private static volatile RetrofitUtils instance; private Retrofit retrofit; private RetrofitUtils(){ } private RetrofitUtils(String baseUrl){ OkHttpClient client = new OkHttpClient(); retrofit = new Retrofit.Builder() .client(client) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .baseUrl(baseUrl) .build(); } public static RetrofitUtils getInstance(String baseUrl){ if (instance==null){ synchronized (RetrofitUtils.class){ if (null==instance){ instance = new RetrofitUtils(baseUrl); } } } return instance; } public static RetrofitUtils getInstance(){ if (null == instance){ return getInstance("http://api.tianapi.com/"); } return instance; } public Retrofit getRetrofit(){ return retrofit; } }
NewsPresenter
package bwei.com.wanghongyun20180421.presenter; import java.util.List; import bwei.com.wanghongyun20180421.bean.JavaBean; import bwei.com.wanghongyun20180421.callbback.BolgService; import bwei.com.wanghongyun20180421.callbback.NewsView; import bwei.com.wanghongyun20180421.httputils.RetrofitUtils; import retrofit2.Retrofit; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.schedulers.Schedulers; /** * Created by why on 2018/4/21. */ public class NewsPresenter { private NewsView inv; private Subscription subscribe; public void attachView(NewsView inv){ this.inv = inv; } public void getNews(String key,int num){ Retrofit retrofit = RetrofitUtils.getInstance().getRetrofit(); BolgService service = retrofit.create(BolgService.class); subscribe = service.getUrl(key, num) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<JavaBean>() { @Override public void call(JavaBean javaBean) { List<JavaBean.NewslistBean> list = javaBean.getNewslist(); inv.success(list); } }, new Action1<Throwable>() { @Override public void call(Throwable throwable) { inv.failed(throwable.getMessage()); } }); } public void detachView(){ // 当Activity销毁的时候取消订阅时间,防止内存泄漏 if (subscribe != null) { if (subscribe.isUnsubscribed()) { subscribe.unsubscribe(); } } if (inv!=null){ inv = null; } } }
AppCompatActivity
package bwei.com.wanghongyun20180421; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.util.Log; import com.facebook.drawee.backends.pipeline.Fresco; import com.jcodecraeer.xrecyclerview.ProgressStyle; import com.jcodecraeer.xrecyclerview.XRecyclerView; import java.util.ArrayList; import java.util.List; import bwei.com.wanghongyun20180421.adapter.MyAdapter; import bwei.com.wanghongyun20180421.bean.JavaBean; import bwei.com.wanghongyun20180421.callbback.NewsView; import bwei.com.wanghongyun20180421.presenter.NewsPresenter; public class MainActivity extends AppCompatActivity { private List<JavaBean.NewslistBean> list = new ArrayList<>(); private int num=10; private NewsPresenter presenter; private MyAdapter adapter; private XRecyclerView xRecyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); xRecyclerView = (XRecyclerView) findViewById(R.id.recyclerview); LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); xRecyclerView.setLayoutManager(layoutManager); Fresco.initialize(this); getData(num); xRecyclerView.setPullRefreshEnabled(true); xRecyclerView.setLoadingMoreEnabled(true); xRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader); xRecyclerView.setLoadingMoreProgressStyle(ProgressStyle.Pacman); xRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() { @Override public void onRefresh() { new Handler().postDelayed(new Runnable(){ public void run() { num=10; getData(num); xRecyclerView.refreshComplete(); } }, 2000); } @Override public void onLoadMore() { new Handler().postDelayed(new Runnable(){ public void run() { num+=10; getData(num); xRecyclerView.refreshComplete(); } }, 2000); } }); } public void getData(int count){ presenter = new NewsPresenter(); presenter.getNews("71e58b5b2f930eaf1f937407acde08fe", count); presenter.attachView(new NewsView() { @Override public void success(List<JavaBean.NewslistBean> data) { list.clear(); list.addAll(data); Log.i("zzz", "success: " + list.toString()); if (adapter==null){ adapter = new MyAdapter(list, MainActivity.this); xRecyclerView.setAdapter(adapter); }else { adapter.notifyDataSetChanged(); } } @Override public void failed(String e) { } }); } @Override protected void onDestroy() { super.onDestroy(); if (presenter!=null){ presenter.detachView(); } } }