MVP+Rxjava+Retryfit+分页加载+RecyclerView展示,解析以集合开头的json数据
2017-12-06 11:46
561 查看
添加依赖:
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")
4000
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 {
在清单列表注册 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"/>
//recyclerView获取数据 compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'//butterknife注解 implementation 'com.jakewharton:butterknife:8.8.1' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'// fresco compile 'com.facebook.fresco:fresco:0.12.0'// Retrofit库 compile 'com.squareup.retrofit2:retrofit:2.0.1' // rxjava+rxandroid+retrofit2+okhttp compile 'io.reactivex:rxjava:1.0.14' compile 'io.reactivex:rxandroid:1.0.1' compile 'com.squareup.retrofit2:converter-gson:2.0.1' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.1' compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'//gson解析数据 compile 'com.google.code.gson:gson:2.6.2'
添加权限:
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.FLASHLIGHT" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></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")
4000
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 193a4 (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"/>
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"/>
相关文章推荐
- MVP+Rxjava+Retryfit+分页加载+RecyclerView展示,解析以集合开头的json数据
- 打造Android集合控件数据绑定(支持添加监听,支持AbsListView与RecycleView,支持异步加载等)(二)ORM注解以及解析
- fresco加载图片+EventBus Activity之间跳转传值+GreenDAo数据库+retrofit请求数据+recyclerview展示数据+ButterKnife找控件
- android结合异步任务,动态加载图片,Json解析数据展示在ListView,并且实现按日期分类展示,借口回调
- 从接口读取数据,Json解析后显示在RecyclerView上
- 在Android Studio上使用GSON+VOLLEY,秒处理网络数据成集合。感受框架的力量。搭配RecyclerView和SwipeRefreshLayout,实现底端加载更多,下拉刷新。
- ajax异步加载解析复杂json(集合中包含对象,对象中包含对象)数据
- RecyclerView的多条目展示,使用OkHttp解析数据
- 使用RecyclerView获取xml数据(csdn的数据)并解析展示(二)
- RecyclerView展示固定数据、上拉加载更多、下拉刷新、点击事件、长按点击事件、删除条目、刷新条目、添加条目、多条目加载
- OkHttp解析数据,RecyclerView和Glide的加载图片
- RecyclerView更全解析之 - 打造通用的下拉刷新上拉加载
- 打正式包混淆时遇到的坑,不要把依赖包里的model给混淆了,否则json解析的时候会找不到model,导致加载不出数据,都是null
- Android使用OKHTTP网络框架请求数据,RecyclerView结合Glide展示图片,瀑布流布局样式
- [置顶] RecyclerView 展示同日期下的数据信息
- 展示数据使用:recyclerview,retrofit,greendao,butterknife,eventbus,fresco。实现效果图列表。MVP模式。
- json数据传到前台并解析展示成列表的方法
- volley获取JSON数据+异步加载图片+NetworkImageView加载网路图片(一)
- 新语言Kotlin使用recyclerview展示数据+retrofit请求数据+Rxjava
- banner+Recyclerview+Gson+okhtto请求网络数据+解析