1. 程式人生 > >3秒鐘不懂你砍我:RecyclerView下拉重新整理和上拉載入更多(開源中國List業務流程全解析)

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);
這樣就可以成功解析)

這樣一來,你的這塊業務流程就透徹了,即使現在叫你去上班,讓你去搞出這個也是輕輕鬆鬆了。