在RecyclerView中获取可见项目

android android-recyclerview

154950 观看

5回复

35083 作者的声誉

我需要知道我的RecyclerView当前显示哪些元素。OnScrollListener.onScroll(...)ListViews 上的方法没有等价物。我尝试过View.getGlobalVisibleRect(...),但是那个黑客太丑了,并不总是有用。

有人有什么想法吗?

作者: rekire 的来源 发布者: 2014 年 7 月 28 日

回应 (5)


4

1115 作者的声誉

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

作者: Sreejith B Naick 发布者: 28.07.2014 06:47

496

24348 作者的声誉

决定

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

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

例如:

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

对于LinearLayoutManager,第一个/最后一个取决于适配器订购。不要查询孩子RecyclerView; LayoutManager可能更喜欢布局比缓存可见的更多项目。

作者: yigit 发布者: 31.07.2014 07:50

1

1278 作者的声誉

为此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;

记得检查一下是否为空。

作者: Douglas Nassif Roma Junior 发布者: 17.05.2016 07:57

7

138 作者的声誉

最后,我找到了一个解决方案,可以从适配器中的onBindViewHolder事件中了解当前项是否可见。

关键是LayoutManager中的方法isViewPartiallyVisible

在适配器中,您可以从RecyclerView获取LayoutManager,您可以从onAttachedToRecyclerView事件获取该参数。

作者: Ernesto Vega 发布者: 06.02.2018 03:34

0

79 作者的声誉

以下Linear / Grid LayoutManager方法可用于检查哪些项目visible

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

如果您想跟踪is item visible on screen某个阈值,那么您可以参考以下博客。

https://proandroiddev.com/detecting-list-items-perceived-by-user-8f164dfb1d05

作者: Sumit Jain 发布者: 07.02.2019 09:01
32x32