最近在写关于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)
}
本文介绍了一种在RecyclerView中计算滑动距离的方法,包括已滑动距离、剩余滑动距离和总滑动距离的计算公式。通过获取item高度和数量,可以准确判断RecyclerView是否滑动到底部。

2295

被折叠的 条评论
为什么被折叠?



