2017-08-11 192 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的末尾。

相关问题