判斷RecyclerView到達底部的幾種方法


參考文章: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;
}

原理:

image

computeVerticalScrollExtent()是當前屏幕顯示的區域高度,computeVerticalScrollOffset() 是當前屏幕之前滑過的距離,而computeVerticalScrollRange()是整個View控件的高度。

3、滾動試驗法

即嘗試是否能滾動。

RecyclerView.canScrollVertically(1); // false表示已經滾動到底部
RecyclerView.canScrollVertically(-1); // false表示已經滾動到頂部

實際與第二種是相同的,canScrollVertically()的源碼:

image

4、計算item高度與RV高度比較

算出滑過的item的距離,加上屏幕高度,再與RV高度比較。

實際與方法二原理一致,這里不再闡述。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM