最近想动手实现 RecyclerView 的“自动加载更多”功能,即当 RecyclerView 滑动到底部时,执行加载更多操作。这里的关键在于,需要监听RecyclerView是否滑动到底部。 
分析 RecyclerView 有 addOnScrollListener(OnScrollListener) 方法,可以为 RecyclerView 添加滚动监听,其中 OnScrollListener 有两个回调函数:
onScrollStateChanges(RecyclerView recyclerView, int newState): 在 RecyclerView 的滚动状态发生改变时回调 
onScrolled(RecyclerView recyclerView, int dx, int dy): 在 RecyclerView 滚动时回调 
 
在 OnScrollListener 回调中,可以获取RecyclerView的滚动状态,我们只需要通过继承 OnScrollListener 并复写上面的两个回调函数,便可以实现对 RecyclerView 滑动到底部的监听。
实现 我们先定义一个回调接口 BottomListener 用以监听控件是否滚动到底部:
1 2 3 4 5 6 7 public  interface  BottomListener           void  onScrollToBottom ()  } 
然后,我们继承 RecyclerView.OnScrollListener 和实现 BottomListener :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 import  android.support.v7.widget.GridLayoutManager;import  android.support.v7.widget.LinearLayoutManager;import  android.support.v7.widget.RecyclerView;import  android.support.v7.widget.StaggeredGridLayoutManager;public  class  RecyclerViewScrollListener  extends  RecyclerView .OnScrollListener  implements  BottomListener           private  int [] lastCompletelyVisiblePositions;          private  int  lastCompletelyVisibleItemPosition;     @Override      public  void  onScrolled (RecyclerView recyclerView, int  dx, int  dy)           RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();                  if  (layoutManager instanceof  StaggeredGridLayoutManager) {             StaggeredGridLayoutManager manager = (StaggeredGridLayoutManager) layoutManager;             if  (lastCompletelyVisiblePositions == null ) {                 lastCompletelyVisiblePositions = new  int [manager.getSpanCount()];             }             manager.findLastCompletelyVisibleItemPositions(lastCompletelyVisiblePositions);             lastCompletelyVisibleItemPosition = getMaxPosition(lastCompletelyVisiblePositions);         } else  if  (layoutManager instanceof  GridLayoutManager) {             lastCompletelyVisibleItemPosition = ((GridLayoutManager) layoutManager).findLastCompletelyVisibleItemPosition();         } else  if  (layoutManager instanceof  LinearLayoutManager) {             lastCompletelyVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastCompletelyVisibleItemPosition();         } else  {             throw  new  RuntimeException("Unsupported LayoutManager." );         }     }     private  int  getMaxPosition (int [] positions)           int  max = positions[0 ];         for  (int  i = 1 ; i < positions.length; i++) {             if  (positions[i] > max) {                 max = positions[i];             }         }         return  max;     }     @Override      public  void  onScrollStateChanged (RecyclerView recyclerView, int  newState)           RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();                  int  visibleItemCount = layoutManager.getChildCount();         int  totalItemCount = layoutManager.getItemCount();         if  (newState == RecyclerView.SCROLL_STATE_IDLE) {             if  (visibleItemCount > 0  && lastCompletelyVisibleItemPosition >= totalItemCount - 1 ) {                 onScrollToBottom();             }         }     }     @Override      public  void  onScrollToBottom ()       } } 
上述大体思路就是: 找到 “最后完全可见项的位置(lastCompletelyVisibleItemPosition)”,通过比较 lastCompletelyVisibleItemPosition 是否是 RecyclerView 最后一项,来判断是否滑动到底部。
在 RecyclerView 上应用加载更多:
1 2 3 4 5 6 7 8 9 10 11 12 13 recyclerView.addOnScrollListener(new  RecyclerViewScrollListener() {             @Override              public  void  onScrollToBottom ()                                    doLoadMore();                  }         }); private  void  doLoadMore ()       } 
参考链接:通过重写OnScrollListener来监听RecyclerView是否滑动到底部 
特别注意 RecyclerView 列表中最后一个元素可见的时候,RecyclerView 并不一定滑动到最底部了。当然了,具体采取哪种方案,需要根据实际需求来确定。