前言
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,完美解決!