參考文章:https://www.jianshu.com/p/c138055af5d2
1、比較lastItem的pos
通過比較當前屏幕可見最后一個item的position和整個RV的最后一個item的position,是同一個則到達底部。
public static boolean isVisBottom(RecyclerView recyclerView){
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
//屏幕中最后一個可見子項的position
int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
//當前屏幕所看到的子項個數
int visibleItemCount = layoutManager.getChildCount();
//當前RecyclerView的所有子項個數
int totalItemCount = layoutManager.getItemCount();
//RecyclerView的滑動狀態
int state = recyclerView.getScrollState();
if(visibleItemCount > 0 && lastVisibleItemPosition == totalItemCount - 1 && state == recyclerView.SCROLL_STATE_IDLE){
return true;
} else {
return false;
}
}
上面通過LinearLayoutManager#findLastVisibleItemPosition()
獲取最后一個可見item的pos,導致最后一個item未完全顯示時停止滑動,再滑動就會誤判為到達底部。
解決辦法是將該方法換為LinearLayoutManager#findLastCompletelyVisibleItemPosition()
,獲取最后一個完全可見的item的pos。
但是仍然會有個問題:如果lastItem高度超過屏幕高度,則無法正確判斷。
2、比較高度
通過比較屏幕高度+View滑過的高度與View的總高度進行判斷。
public static boolean isSlideToBottom(RecyclerView recyclerView) {
if (recyclerView == null) return false;
if (recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset()
>= recyclerView.computeVerticalScrollRange())
return true;
return false;
}
原理:
computeVerticalScrollExtent()是當前屏幕顯示的區域高度,computeVerticalScrollOffset() 是當前屏幕之前滑過的距離,而computeVerticalScrollRange()是整個View控件的高度。
3、滾動試驗法
即嘗試是否能滾動。
RecyclerView.canScrollVertically(1); // false表示已經滾動到底部
RecyclerView.canScrollVertically(-1); // false表示已經滾動到頂部
實際與第二種是相同的,canScrollVertically()的源碼:
4、計算item高度與RV高度比較
算出滑過的item的距離,加上屏幕高度,再與RV高度比較。
實際與方法二原理一致,這里不再闡述。