//加依赖 compile 'io.reactivex:rxandroid:1.1.0' compile 'com.squareup.retrofit2:retrofit:2.0.1' compile 'com.squareup.retrofit2:converter-gson:2.0.1' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1' compile 'com.google.code.gson:gson:2.8.1' compile 'com.android.support:recyclerview-v7:26.+' compile 'com.squareup.okhttp3:okhttp:3.9.0' compile 'com.squareup.okio:okio:1.13.0' compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' compile 'com.facebook.fresco:fresco:0.12.0'
//加权限 <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
public interface IView { void showList(List<MyBean.DataBean> list); void showError(String e); }
public class Api { //http://mnews.gw.com.cn/wap/data/news/txs/page_1.json public static final String PATH = "http://mnews.gw.com.cn/"; }
public interface ApiService { @GET("wap/data/news/txs/page_{pages}.json") Observable<List<MyBean>> getdatas(@Path("pages")int pages) ; }
public interface OnRequestListener { void OnSuccess(List<MyBean.DataBean> list); void OnError(String e); }
public interface IModel { void RequestData(String url,int page,OnRequestListener onRequestListener); }
public class ListModel implements IModel { @Override public void RequestData(String url,int page, final OnRequestListener onRequestListener) { //retrofit网络请求 Retrofit retrofit=new Retrofit .Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); //结合rxjava Observable<List<MyBean>> getdatas = apiService.getdatas(page); getdatas.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<List<MyBean>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { onRequestListener.OnError(e.getMessage().toString()); } @Override public void onNext(List<MyBean> myBeen) { List<MyBean.DataBean> data = myBeen.get(0).data; onRequestListener.OnSuccess(data); } }); } }
public interface IPresenter { void loadList(String url,int page); }
public class ListPresenter implements IPresenter { private IView iView; private IModel iModel; public ListPresenter(IView iView) { this.iView = iView; iModel = new ListModel(); } //model层与view层交互 @Override public void loadList(String url,int page) { iModel.RequestData(url,page, new OnRequestListener() { @Override public void OnSuccess(List<MyBean.DataBean> list) { iView.showList(list); } @Override public void OnError(String e) { iView.showError(e); } }); } }
public class MyBean {public HeaderBean header; public List<DataBean> data; public static MyBean objectFromData(String str) { return new Gson().fromJson(str, MyBean.class); } public static class HeaderBean {public int pagesize; public String last; public String pre; public String next; public int totalsize; public String first; public int totalpage; public static HeaderBean objectFromData(String str) { return new Gson().fromJson(str, HeaderBean.class); } } public static class DataBean {public String summary; public String img; public String advTypeShare; public String url; public int countid; public String id; public String title; public String otime; public String source; public String views; public String resType; public static DataBean objectFromData(String str) { return new Gson().fromJson(str, DataBean.class); } } }
在清单列表注册 android:name=".App"
public class App extends Application { @Override public void onCreate() { super.onCreate(); Fresco.initialize(this); } }
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private Context context; private List<MyBean.DataBean> list; public MyAdapter(Context context, List<MyBean.DataBean> list) { this.context = context; this.list = list; } @Override public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) { holder.img.setImageURI(list.get(position).img); holder.tv.setText(list.get(position).title); } @Override public int getItemCount() { return list.size(); } public class ViewHolder extends RecyclerView.ViewHolder{ public SimpleDraweeView img; public TextView tv; public ViewHolder(View itemView) { super(itemView); img=itemView.findViewById(R.id.item_img); tv=itemView.findViewById(R.id.tv); } } }
public class MainActivity extends AppCompatActivity implements IView{ private RecyclerView recycler; private MyAdapter myAdapter; private int p=1; private SwipeRefreshLayout swif; private ListPresenter listPresenter; private LinearLayoutManager linearLayoutManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recycler = (RecyclerView) findViewById(R.id.recycler); swif = (SwipeRefreshLayout) findViewById(R.id.swif); linearLayoutManager = new LinearLayoutManager(MainActivity.this); recycler.setLayoutManager(linearLayoutManager); listPresenter = new ListPresenter(this); listPresenter.loadList(Api.PATH,p); } @Override public void showList(final List<MyBean.DataBean> list) { //设置recyclerview展示 myAdapter = new MyAdapter(MainActivity.this, list); recycler.setAdapter(myAdapter); recycler.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition(); if (lastVisibleItemPosition == list.size() - 1) { p++; listPresenter.loadList(Api.PATH,p); } } }); swif.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { p++; listPresenter.loadList(Api.PATH,p); swif.setRefreshing(false); } }); } @Override public void showError(String e) { Toast.makeText(this, "" + e, Toast.LENGTH_SHORT).show(); Log.e("哈哈哈哈啊哈哈哈哈", e); } }
//主页面布局 <android.support.v4.widget.SwipeRefreshLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/swif"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/recycler"></android.support.v7.widget.RecyclerView> </android.support.v4.widget.SwipeRefreshLayout>
//Adapter布局 <com.facebook.drawee.view.SimpleDraweeView android:id="@+id/item_img" android:layout_width="150dp" android:layout_height="150dp" android:layout_margin="8dp" fresco:failureImage="@mipmap/ic_launcher" /> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/tv" android:text="dfdf" android:gravity="center"/>