RecyclerView加载完成后如何获取当前屏幕内可见元素的总数量
获取RecyclerView当前屏幕可见元素数量的实现方法
Android官方在RecyclerView的LayoutManager中已经提供了获取可见元素位置的API,直接调用对应方法计算即可,不需要额外遍历子View。
实现注意事项
- 必须等RecyclerView完成布局、数据渲染完成后再调用计算逻辑,否则会得到0或者错误的数值,推荐通过RecyclerView的
post方法延迟执行,保证所有元素已经加载到屏幕上。 - 若需要统计完全露出的元素,把方法替换为
findFirstCompletelyVisibleItemPosition和findLastCompletelyVisibleItemPosition即可,不会统计只露出一部分的元素。 - 不要直接调用
recyclerView.getChildCount()计算,当列表有item缓存时该值会比实际可见数量多,结果不准确。
代码示例
Kotlin版本
recyclerView.post { val layoutManager = recyclerView.layoutManager as? LinearLayoutManager ?: return@post val firstVisiblePos = layoutManager.findFirstVisibleItemPosition() val lastVisiblePos = layoutManager.findLastVisibleItemPosition() val visibleCount = if (firstVisiblePos == RecyclerView.NO_POSITION || lastVisiblePos == RecyclerView.NO_POSITION) { 0 } else { lastVisiblePos - firstVisiblePos + 1 } // 此处visibleCount即为当前可见的元素数量 }
Java版本
recyclerView.post(new Runnable() { @Override public void run() { if (!(recyclerView.getLayoutManager() instanceof LinearLayoutManager)) { return; } LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); int firstVisiblePos = layoutManager.findFirstVisibleItemPosition(); int lastVisiblePos = layoutManager.findLastVisibleItemPosition(); int visibleCount = 0; if (firstVisiblePos != RecyclerView.NO_POSITION && lastVisiblePos != RecyclerView.NO_POSITION) { visibleCount = lastVisiblePos - firstVisiblePos + 1; } // 此处visibleCount即为当前可见的元素数量 } });
特殊布局适配
- GridLayoutManager:直接替换LayoutManager类型为GridLayoutManager,逻辑完全一致。
- StaggeredGridLayoutManager:需要先获取多列的可见位置数组,再取最大最小值计算:
val layoutManager = recyclerView.layoutManager as StaggeredGridLayoutManager val firstPosArray = IntArray(layoutManager.spanCount) layoutManager.findFirstVisibleItemPositions(firstPosArray) val firstVisiblePos = firstPosArray.minOrNull() ?: RecyclerView.NO_POSITION val lastPosArray = IntArray(layoutManager.spanCount) layoutManager.findLastVisibleItemPositions(lastPosArray) val lastVisiblePos = lastPosArray.maxOrNull() ?: RecyclerView.NO_POSITION

上述示例中计算得到的visibleCount值为4,和标注的Add按钮数量一致。
内容的提问来源于stack exchange,提问作者Pedro L Freitas
相关产品推荐
相关产品推荐

