3秒钟不懂你砍我:RecyclerView下拉刷新和上拉加载更多(开源中国List业务流程全解析)

来源:互联网 发布:手机淘宝如何申请贷款 编辑:程序博客网 时间:2024/05/17 11:05

这里以开源中国开源资讯页面为例子。


这个页面数据的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);
这样就可以成功解析)

这样一来,你的这块业务流程就透彻了,即使现在叫你去上班,让你去搞出这个也是轻轻松松了。

阅读全文
0 0