参考文章: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高度比较。
实际与方法二原理一致,这里不再阐述。