如何優雅的給recycleView增加下拉刷新和加載更多

recycleView作為一個新的控件,那是有其特點的。在日常的使用中,基本是可以代替listView和gridview使用的,同時,它還多了一種瀑布流的展示方式。

因此,個人是比較推薦開發者在項目開發過程中逐漸的使用recycview代替listview和gridview的。大家也都知道產品經理的想法永遠是捉摸不定的,這次跟你說要垂直布局,好,等你用listview做完之后,就又跟你說覺得網格布局可能會好一點!!!ok,當你終于把控件轉換成gridview,修改了大量的代碼之后。如果,產品經理再跟你說,最后決定還是使用瀑布流得我樣式好了, 你會不會有種崩潰的感覺。反正,我是會和PM打一架再說的。。。

總而言之,竟然最后還是得從了PM,何不一開始就已經做好準備呢?

RecyclView就是這樣的一款新的控件。它把布局管理,item動畫等都獨立暴露了出來。雖然代碼是增加了,但是卻變得更加的靈活了,像上面的需求你只需要改動一行代碼就可以實現了。

關于RecyView如何使用,網上已經有太多的教程了,因此我也不再講解,大家可以參考下面這位大神的文章:

RecyclerView使用完全指南,是時候體驗新控件了

這是一篇講解的已經很詳細的文章了,感謝作者的分享(還沒有經過您的同意就放上你的文章,請見諒哈)

我這一片文章主要講解的是如何優雅的增加下拉刷新和加載更多

關于下拉刷新

下拉刷新,在網上已經是有很多種的解決方案了,個人是比較喜歡通過在RecyView外層包裹一層 SwipeRefreshLayout來處理的。

SwipeRefreshLayout作為一個新的控件,使用簡單,樣式好看~

1.在xml中使用SwipeRefreshLayout包裹RecycleView


xml布局

2.綁定控件

refresh_layout= (SwipeRefreshLayout) rootView.findViewById(R.id.refresh_layout);

//添加刷新監聽器

refresh_layout.setOnRefreshListener(newSwipeRefreshLayout.OnRefreshListener() {

? @Override

? public voidonRefresh() {

? //加載數據

? backURL();

}

});

3.在加載完數據之后,記得要在UI線程中調用

if(refresh_layout.isRefreshing()){

? ? refresh_layout.setRefreshing(false);

}

記住這個操作只能在UI線程中執行,而且要是忘記了這個操作,那么即使在加載完數據之后,加載動畫也不會停下來的

關于SwipRefreshLayout的更多用法可以參考

Android開發之SwipeRefreshLayout實現下拉刷新

總體的用法還是非常的簡單易用的。好啦,下拉刷新就是這么的簡單。

這一次的重點來了:

實現加載更多

網上實現加載更多的方法有很多。

今天由于想把項目的體積降下來,要砍掉一些沒有必要的庫,然后我就看到之前為了省時間直接就依賴了一個項目來實現瀑布流,然后瀑布流的布局在整個項目中,其實就只用了一次,就因為只用一次的東西而增加了一個依賴項目,真的是非常的蠢。所有我決定把這個依賴項目砍掉(并不是說這個項目不好)。既然要砍掉它,那就要找到它的替代品,所以我就把目光投向了RecycleView了,使用RecycleView實現瀑布流布局其實還是非常的快的,只要把?

mLayoutManager=newStaggeredGridLayoutManager(2,OrientationHelper.VERTICAL);?

就可以實現了。

關鍵還是在于實現下拉刷新和加載更多。下拉刷新在上面已經講到怎么實現了,下面開始講加載更多

在RecycleView中是沒有onItemClickLinstener,OnItemLongClickListener以及加載更多等等的接口的。這一切都是要是自己實現的。本著不重復造輪子的精神,我先上google了一下。

發現大多是這樣子的

拉刷新和上拉加載更多的RecyclerView,具有下拉和刷新動畫

實現RecyclerView下拉刷新和上拉加載更多以及RecyclerView線性、網格、瀑布流效果演示

What the hell?(并沒有說這樣子的方法不科學,只是可以更簡單的解決)

我只是要簡單的實現加載更多,有必要改動這么多,還要增加footerview,還有對RecycleView增加OnScrollLinstener來監聽是否到達最后一條,還有用 mLayoutManager.findLast...關鍵是瀑布流的layoutmanager還沒有這個接口。。。

于是就開始思考,竟然單擊事件,長按事件可以通過訂閱的方式來實現,那么加載更多是不是也可以?

如果我在初始化Adapter的時候就告訴Adapter:如果到了最后一條數據就告訴我,我來加載更多。

本著這樣的想法,我在Adapter的初始化總增加了這一個參數

ps:在評論中有同學指出如果不滿一屏可能會頻繁觸發loadMoreListener,解決方法就是增加一個 參數 pageNum,用于判斷當前數據滿不滿

publicListAdapter_pic(Context context,List listData,

OnItemClickListener listener,in.yeyeapp.listeners.OnLoadMoreListener loadMoreListener,int pageNum) {

mListener= listener;

mContext= context.getApplicationContext();

this.mInflater= LayoutInflater.from(mContext);

this.data= listData;

this.pageNum = pageNum;

//訂閱加載更多

this.loadMoreListener= loadMoreListener;

}

實現加載更多的具體做法

mAdapter=newListAdapter_pic(getActivity(),mListAlbums,(OnItemClickListener)this, newOnLoadMoreListener() {

@Override

public voidonLoadMore() {

currentPage++;

nextPage();

}

});

OnLoadMore的具體實現

public interfaceOnLoadMoreListener {

public voidonLoadMore();

}

接下來是在合適的時候觸發事件。

仔細閱讀Adapter的代碼我們會發現 onBindViewHolder 是負責繪制ItemView的函數,所以它是知道它當前已經畫到第一幾個Item了,所以這項重任就交給它了

@Override

public voidonBindViewHolder(ViewHolder holder, intposition) {

//新增對 loadMoreListener 的非空判斷,以及對數據數目滿屏的判斷,防止觸發空指針錯誤及數據不滿而頻繁觸發加載更多

if(position == getItemCount() -1 && loadMoreListener != null && getCount() > pageNum) {

//告訴訂閱者已經到最后一個了,可以加載更多了

loadMoreListener.onLoadMore();

}

//其他綁定資源的操作

。。。

}

這樣,加載更多就大功告成了!!!

基本在網絡良好的情況下,是可以無感的加載更多的

做法也是比較的簡單

核心的思想就是讓Adapter在繪制到最后一個view的時候告訴主線程說可以更新了。。。

如果想讓加載更多更快一步執行,可以通過修改判斷的條件

if(position == getItemCount() -1)

可以在倒數第二個,倒數第三個等就可以加載更多,這樣可以讓用戶更加感知不到加載的過程

不過就要注意數據的個數了

如果這篇文章又幫到你的話,請點一下‘喜歡’,我會更努力的創作的

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,048評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,414評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,169評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,722評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,465評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,823評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,813評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,000評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,554評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,295評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,513評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,722評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,125評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,430評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,237評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,482評論 2 379

推薦閱讀更多精彩內容