3秒钟不懂你砍我:RecyclerView下拉刷新和上拉加载更多(开源中国List业务流程全解析)
这里以开源中国开源资讯页面为例子。
这个页面数据的url:http://www.oschina.net/action/apiv2/news?pageToken= 是这样的
json数据的结构:
NewsBean返回成功与否的code和msg。
ResultBean返回的是上一页,下一页的数据,以及item集合
ItemBean返回的是RecyclerView每一个item的数据,包含了很多个item,这些item都存储在resultbean中的List<item>中,
所以取得item的方式:List<NewsBean.ResultBean.ItemBean> list = NewsBean.getResult().getItems();(NewsBean是你取得的json转化而来的Bean)
用插件GsonFormat把服务器的Gson格式转化为NewsBean格式
生成这样一个Bean,为了简短,我删去了getter和setter
package com.example.oschina6.bean; import org.itheima.recycler.bean.BasePageBean; import java.util.List; public class NewsBean extends BasePageBean<NewsBean.ResultBean.ItemsBean>{ private int code; private String message; private ResultBean result; private String time; public static class ResultBean { private String nextPageToken; private String prevPageToken; private int requestCount; private int responseCount; private int totalResults; private List<ItemsBean> items; public static class ItemsBean { private String author; private String body; private int commentCount; private String href; private int id; private String pubDate; private boolean recommend; private String title; private int type; private int viewCount; } } }数据的结构是这样的
NewsBean,返回的是Code和Msg,提示请求的成功与否。
ResultBean,返回的是NextPageToken,PrePageToken,就是重头戏历史和最新的数据。
ItemBean,返回的是每个Item的数据信息,内容,id,作者名,评论数。json中这么多的item,都存储在了ResultBean中的List中。
private List<ItemsBean> items;
(接下来就是关于如何把数据加到List中去,懂的可以跳过。
newsBean.getResult().getItems()
这个就是取得了List<NewsBean.ResultBean.ItemBean>,之后就可以把数据加到RecyclerView中去了。)
下拉刷新
其实就是把http://www.oschina.net/action/apiv2/news?pageToken=这个url重新请求一遍,比对一下List<NewsBean.ResultBean.ItemBean>最新数据和当前数据size()的差别。做出判断,如果最新数据更长,就把最新数据的头部新增的几项赋给老的。下面代码就是上篇文章下拉刷新的逻辑。
Request(newsUrl, "get", null, null, new RequestInterface() { @Override public void SuccessResponse(String s) { NewsBean newNewsBean = new Gson().fromJson(s, NewsBean.class); List<NewsBean.ResultBean.ItemsBean> newNewsList = newNewsBean.getItemDatas(); int oldSize = newNewsBean.getItemDatas().size(); if (oldSize != newsBean.getItemDatas().size()) { newsBean = newNewsBean; int newSize = oldSize - newsBean.getItemDatas().size(); for (int i = 0; i < newSize; i++) { newsList.add(0, newNewsList.get(newSize - i)); } commonAdapter.notifyDataSetChanged(); } mSwipeRefreshLayout.setRefreshing(false);//这个是关闭加载的progressbar } });
上拉加载更多,再看一下url http://www.oschina.net/action/apiv2/news?pageToken=,是可以输入的,所以只需要找到昨天的pageToken就好了,在bean的这个地方
public static class ResultBean { private String nextPageToken;//这个就是昨天的分页 private String prevPageToken; private int requestCount; private int responseCount; private int totalResults; private List<ItemsBean> items;这个nextPageToken就是昨天的东西,所以你需要输入的url是最新页面给的nextPageToken,加在尾部,就可以得到昨天的资讯了
先进入http://www.oschina.net/action/apiv2/news?pageToken=这个网站去找nextpagetoken
发现是DBA816934CD0AA59,所以昨天的url是http://www.oschina.net/action/apiv2/news?pageToken=DBA816934CD0AA59,进入
通过手机app拉到最下面查看发现果然是昨天的资讯。所以明白了,在上拉加载更多这个过程中,是先找到这个分页的nextpagetoken,加到url最后面访问昨天的json,再在昨天的json中找到nextpagetoken,找到前天的json,以此类推。
String nextPageNewsUrl = newsUrl + nextPageToken; Request(nextPageNewsUrl, "get", null, null, new RequestInterface() { @Override public void SuccessResponse(String s) { NewsBean newNewsBean = new Gson().fromJson(s, NewsBean.class); nextPageToken = newNewsBean.getResult().getNextPageToken(); newsList.addAll(newNewsBean.getItemDatas()); commonAdapter.notifyDataSetChanged();//提醒adapter数据变化了 } });
这样一来就成功实现了,而且非常的流畅,但是上拉加载更多没有任何的UI特效。
(如果想美化一下UI,如最上面开源中国那个页面所示:
1.给RecyclerView添加头Header和尾Footer(需要在adapter里修改)
2.添加RecyclerView的分割线(其实直接在item里加条View线就好)
可以看看这个人的文章:http://www.jianshu.com/p/991062d964cf)
(怎么解析这个复杂的json为Bean?需要Gson的jar包。导入成功后,只需要
NewsBean newNewsBean = new Gson().fromJson(s, NewsBean.class);这样就可以成功解析)
这样一来,你的这块业务流程就透彻了,即使现在叫你去上班,让你去搞出这个也是轻轻松松了。