在RecyclerView中获取可见的项目

我需要知道哪些元素当前显示在我的RecyclerView。 ListViews上没有等效于OnScrollListener.onScroll(...)方法。 我试图与View.getGlobalVisibleRect(...)一起工作,但是这个黑客太难看了,并不总是工作。

有人有什么想法?

第一个/最后一个可见的孩子取决于LayoutManager 。 如果您正在使用LinearLayoutManagerGridLayoutManager ,则可以使用

 int findFirstVisibleItemPosition(); int findFirstCompletelyVisibleItemPosition(); int findLastVisibleItemPosition(); int findLastCompletelyVisibleItemPosition(); 

例如:

 GridLayoutManager layoutManager = ((GridLayoutManager)mRecyclerView.getLayoutManager()); int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition(); 

对于LinearLayoutManager ,first / last取决于适配器的顺序。 不要从RecyclerView查询孩子; LayoutManager可能更愿意布置更多的项目而不是可见的caching。

您可以使用recyclerView.getChildAt()来获取每个可见子项,并在适配器代码的这些视图上设置一些标记convertview.setTag(index)将帮助您将其与适配器数据关联起来。

StaggeredGridLayoutManager做到这一点:

 RecyclerView rv = findViewById(...); StaggeredGridLayoutManager lm = new StaggeredGridLayoutManager(...); rv.setLayoutManager(lm); 

并获得可见的项目视图:

 int[] viewsIds = lm.findFirstCompletelyVisibleItemPositions(null); ViewHolder firstViewHolder = rvPlantios.findViewHolderForLayoutPosition(viewsIds[0]); View itemView = viewHolder.itemView; 

记得检查一下是否为空。