最近在写关于RecyclerView滑动到最底部时,给出一个判断,是否到达最底部。但不知道为什么,总是得不到ScrollY,一直为0。没办法,只能去网上找一些相关资料。
非常感谢知乎用户-张宇 给的想法。原理很简单,主要就是获取item的高度,和item的总数,然后去计算总的长度。
废话不多说,代码贴上:
/**
* 还能向下滑动多少
*/
private int getDownDistance(){
LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
View firstVisibItem = mRecyclerView.getChildAt(0);
int firstItemPosition = layoutManager.findFirstVisibleItemPosition();
int itemCount = layoutManager.getItemCount();
int recycleViewHeight = mRecyclerView.getHeight();
int itemHeight = firstVisibItem.getHeight();
int firstItemBottom = layoutManager.getDecoratedBottom(firstVisibItem);
return (itemCount - firstItemPosition - 1)* itemHeight - recycleViewHeight+firstItemBottom;
}
当前的getDistance()就是剩余的距离。
/**
* 已滑动的距离
*/
private int getUpDistance(){
LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
View firstVisibItem = mRecyclerView.getChildAt(0);
int firstItemPosition = layoutManager.findFirstVisibleItemPosition();
int itemCount = layoutManager.getItemCount();
int recycleViewHeight = mRecyclerView.getHeight();
int itemHeight = firstVisibItem.getHeight();
int firstItemBottom = layoutManager.getDecoratedBottom(firstVisibItem);
return (firstItemPosition + 1)*itemHeight - firstItemBottom;
}
计算RecyclerView已经滑动的距离。
/**
* 获取RecyclerView滚动距离
*/
private int getDistance(){
LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
View firstVisibItem = mRecyclerView.getChildAt(0);
int firstItemPosition = layoutManager.findFirstVisibleItemPosition();
int itemCount = layoutManager.getItemCount();
int recycleViewHeight = mRecyclerView.getHeight();
int itemHeight = firstVisibItem.getHeight();
int firstItemBottom = layoutManager.getDecoratedBottom(firstVisibItem);
return (itemCount - firstItemPosition - 1)* itemHeight - recycleViewHeight;
}
当RecyclerView为LinearLayoutManager.HORIZONTAL获取已滑动距离方法如下
/** * 已滑动的比例 */ private fun getSlidingScale(): Float { if (rv_entry == null) return 0.0f var layoutManager: LinearLayoutManager = rv_entry.layoutManager as LinearLayoutManager //找到即将移出屏幕Item的position,position是移出屏幕item的数量 val position = layoutManager.findFirstVisibleItemPosition() //根据position找到这个Item val firstVisiableChildView = layoutManager.findViewByPosition(position) //获取Item的宽 val itemWidth = firstVisiableChildView!!.width var itemCount = layoutManager.itemCount//当个数太多加载不完时count不正确使用adapter?.itemCount //算出该Item还未移出屏幕的高度 val itemRight = firstVisiableChildView!!.right //position移出屏幕的数量*高度得出移动的距离 val iposition = position * itemWidth //因为横着的RecyclerV第一个取到的Item position为零所以计算时需要加一个宽 var slipDistance = iposition - itemRight + itemWidth//已滑动距离 //总宽度 var rvWidth = itemWidth * (adapter?.itemCount ?: 0) //未滑动距离 var unslidingDistance = rvWidth - layoutManager.width - slipDistance LogUtils.e("onScrolled", "slipDistance 已滑动距离" + slipDistance + "未滑动距离" + unslidingDistance + "总宽度"+rvWidth) return slipDistance * 1.0f / (slipDistance + unslidingDistance) }