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

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

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

这个页面数据的url:http://www.oschina.net/action/apiv2/news?pageToken= 是这样的

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

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)

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

用插件GsonFormat把服务器的Gson格式转化为NewsBean格式

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

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

生成这样一个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=这个网站去找nextpagetoken3秒钟不懂你砍我:RecyclerView下拉刷新和上拉加载更多(开源中国List业务流程全解析)

发现是DBA816934CD0AA59,所以昨天的url是http://www.oschina.net/action/apiv2/news?pageToken=DBA816934CD0AA59,进入

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

通过手机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);
这样就可以成功解析)

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