Android RecyclerView與SwipeRefreshLayout嵌套使用添加上拉加載功能的爬坑之旅

前言

RecyclerView是support.v7包中的控件,可以說是ListView和GridView的增強(qiáng)升級版。

官方對RecyclerView的描述是(不翻譯是因為我并不想打開有道詞典,就這樣):

A flexible view for providing a limited window into a large data set.

RecyclerView從2014年發(fā)布到現(xiàn)在已經(jīng)很長時間了,使用已經(jīng)相當(dāng)普遍。

初入坑的同學(xué)請自行搜索詳細(xì)教程,樓主這里不再贅述。

入坑

既然要做列表,分頁,下拉刷新上拉加載這些司空見慣的功能當(dāng)然必不可少。下拉刷新樓主選用了SwipeRefreshLayout(真心喜歡?。。。┤缓笊侠虞d的時候樓主用的是RecyclerView的滑動監(jiān)聽(什么時候有個像SwipeRefreshLayout一樣完美的上拉加載就好了,重任交給你們了)

recyclerView.setOnScrollListener(newRecyclerView.OnScrollListener() {

@Override

public voidonScrollStateChanged(RecyclerView recyclerView,intnewState) {

?????super.onScrollStateChanged(recyclerView, newState);

????switch(newState) {

????????caseRecyclerView.SCROLL_STATE_IDLE:

????????????if(isSlideToBottom(recyclerView)) {

????????????????initData(); //加載接口

????????????}

????}

????break;

}

}

});

判斷是否到底的方法也是樓主借鑒大神比較靠譜的方法(文化人的事不能叫偷)

public static booleanisSlideToBottom(RecyclerView recyclerView) {

if(recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset()

>= recyclerView.computeVerticalScrollRange()) {

return true;

}else{

return false;

}

}

腳部局添加樓主不在贅述,注意的是recycleView并沒有addFootView(View view)的方法,樓主是在底部隱藏了一個布局 ,到底顯示再隱藏。

問題來了,當(dāng)一頁數(shù)據(jù)量過少不滿一屏?xí)r,加載便出現(xiàn)了問題,下拉刷新觸發(fā)了上拉加載并且不是觸發(fā)了一次!這就導(dǎo)致出現(xiàn)的數(shù)據(jù)是隨機(jī)頁數(shù)上的并無規(guī)律可言。一開始樓主使用斷點調(diào)試并無發(fā)現(xiàn)問題,神奇之處就在這里,斷點調(diào)試的時候下拉刷新并未觸發(fā)上拉加載!但是log輸出時卻能看出下拉刷新觸發(fā)了上拉加載并且不是觸發(fā)了一次!

出坑

? ? 細(xì)細(xì)想來終于明白,原來問題出在判斷recyclerView是否到底上,原理圖如下,是view自帶的方法

原理圖

這樣就很清晰明了,computeVerticalScrollExtent()是當(dāng)前屏幕顯示的區(qū)域高度,computeVerticalScrollOffset() 是當(dāng)前屏幕之前滑過的距離,而computeVerticalScrollRange()是整個View控件的高度。

條目不滿一屏,控件是到底的(其實很簡單的一個道理,牛角尖里的人被蒙蔽了雙眼)這也就導(dǎo)致了下拉刷新的時候,滑動事件分發(fā)(此處有伏筆)給recyleview的時候觸發(fā)了上拉記載,數(shù)據(jù)就會亂掉。

最后

????OK,既然找到了問題所在,解決起來也就有思路了,原先是滑動就觸發(fā),我們只需要判斷一下上滑還是下滑就好了。于是樓主自信滿滿的寫了一個onTouchEvent來監(jiān)聽上下滑,結(jié)果現(xiàn)實總是無情的,完全沒有作用!嚇得樓主立馬找了大神的demo看了一下,完全沒什么問題!最后樓主想到了安卓事件分發(fā)機(jī)制,SwipeRefreshLayout覆蓋掉了onTouchEvent?此處樓主并未深究直接換成dispatchTouchEvent,完美解決!


最近總是一心以為有鴻鵠將至,思援弓繳而射之,難道是窮則思變?233

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容