RecycleView 实现 RecyclerView.OnScrollListener。
RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
// 判断是当前layoutManager是否为LinearLayoutManager
// 只有LinearLayoutManager才有查找第一个和最后一个可见view位置的方法
if (layoutManager instanceof LinearLayoutManager) {
LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager;
//获取第一个可见view的位置
int firstItemPosition = linearManager.findFirstVisibleItemPosition();
//获取最后一个可见view的位置
int lastItemPosition = linearManager.findLastVisibleItemPosition();
Log.d("onScrollStateChanged", "firstItemPosition: " + firstItemPosition);
Log.d("onScrollStateChanged", "lastItemPosition: " + lastItemPosition);
int full = lastItemPosition - firstItemPosition;
int visibleHeight = 0;
for (int i = 0; i <= full; i++) {
View view = recyclerView.getChildAt(i);
Log.d("onScrollStateChanged", "i: " + i);
if (null == view) {
continue;
}
// 包含被遮挡的部分
int[] location = new int[2];
view.getLocationOnScreen(location);
Log.d("onScrollStateChanged", "location: " + Arrays.toString(location));
// 不包含被遮挡的部分
Rect localRect = new Rect();
view.getLocalVisibleRect(localRect);
Log.d("onScrollStateChanged", "localRect: " + localRect.toString());
int showHeight = localRect.bottom - localRect.top;
visibleHeight += showHeight;
}
// visibleHeight 使用getLocalVisibleRect获取的是显示的高度,
// 当子控件铺满时,visibleHeight 的高度等同于recycleView的高度
int height = recyclerView.getHeight();
Log.d("onScrollStateChanged", "visionHeight: " + visibleHeight);
Log.d("onScrollStateChanged", "height: " + height);
}
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
};