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);這樣就可以成功解析)
這樣一來,你的這塊業務流程就透徹了,即使現在叫你去上班,讓你去搞出這個也是輕輕鬆鬆了。