2017-08-11 193 views
-2

我試圖用recyclerview實現無限滾動,它工作正常。但是,我注意到當內容大小小於屏幕高度時,onScrolled永遠不會被調用。我想在滾動時加載更多,但我無法檢測到向下滾動手勢,因爲onScrolled永遠不會被調用,因此我無法獲取dy值。我想知道:如果內容比屏幕高度小,無限滾動recyclerview onScrolled不會觸發

1)在這種情況下我怎樣才能得到滾動方向 2)這種情況的最佳做法是什麼?每次服務呼叫都會收到一定數量的項目。如果返回的項目數量不能填滿屏幕會發生什麼?

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() 
     { 
      int lastVisibleItemPosition, visibleItemCount, totalItemCount; 

      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) 
      { 
       super.onScrolled(recyclerView, dx, dy); 

       if(dy>0) 
       { 
        visibleItemCount = recyclerLayoutManager.getChildCount(); 
        totalItemCount = recyclerLayoutManager.getItemCount(); 
        lastVisibleItemPosition = recyclerLayoutManager.findLastVisibleItemPosition(); 


        if (lastVisibleItemPosition >= totalItemCount) 
        { 

         if (!loading && dy>0 && moreToload) 
         { 
          loadMore(); 
         }      
        } 
       } 

      } 
}); 

謝謝!

+0

嘗試將更多項目加載到您的ListView以使內容大小超過屏幕高度 – GuilhermeFGL

回答

0

您可以嘗試相同的,但與RecyclerView.LayoutManager定製和處理反彈時

@Override 
public int scrollVerticallyBy (int dx, RecyclerView.Recycler recycler, 
RecyclerView.State state) { 
    int scrollRange = super.scrollVerticallyBy(dx, recycler, state); 
    int overscroll = dx - scrollRange; 
    if (overscroll > 0) { 
    // bottom overscroll 
    } else if (overscroll < 0) { 
    // top overscroll 
    } 
    return scrollRange; 
} 
0

onScrolled回調也將被稱爲如果佈局計算後可見項目範圍的變化。請檢查鏈接here

這意味着它總是調用一次結束後負荷的項目到回收站視圖

@Override 
public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
    super.onScrolled(recyclerView, dx, dy); 
    visibleItemCount = recyclerLayoutManager.getChildCount(); 
    totalItemCount = recyclerLayoutManager.getItemCount(); 
    lastVisibleItemPosition = recyclerLayoutManager.findLastVisibleItemPosition(); 

    if ((totalItemCount == visibleItemCount) || //This mean you still have space in your screen 
     (dy > 0 && !loading && lastVisibleItemPosition >= totalItemCount)) { 
     // Call load more here 
    } 
} 

如果服務器不返回任何項目時,recyclerView不會更新,默認情況下onScroll方法將不會再次調用,直到你到達recyclerView的末尾。

相關問題