如何在RecyclerView中找到当前可见项的位置?

3

我正在开发一个使用RecyclerView展示图片幻灯片的应用程序。我使用了以下代码来实现水平滚动RecyclerView。

RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(activity, LinearLayout.HORIZONTAL, false);
imageListRecyclerView.setLayoutManager(mLayoutManager);

此外,我正在使用以下代码以每次滚动一个项目。
SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(imageListRecyclerView);

问题是我想使用技术手段获取当前可见项目的位置。
holder.getAdapterPosition()

但是它没有起作用。有人可以告诉我如何做吗?


为什么不使用 ViewPager - insa_c
我知道,但我不能使用ViewPager。 - Tavinder Singh
这是Kotlin的方式:https://dev59.com/uFoT5IYBdhLWcg3wtRUR#72570694 - Ammar
2个回答

6

LinearLayoutManager有一些辅助方法。

findFirstCompletelyVisibleItemPosition()
Returns the adapter position of the first fully visible view.

int findFirstVisibleItemPosition()
Returns the adapter position of the first visible view.

int findLastCompletelyVisibleItemPosition()
Returns the adapter position of the last fully visible view.

findLastVisibleItemPosition()

要获取完全可见的第一个项目位置,可以使用这篇官方文档中提到的LinearLayoutManager。


1
我在Recyclerview的onScrollListener()中使用了这些,但它不起作用。 - Tavinder Singh
你在使用这些时遇到了什么问题?@TavinderSingh - karandeep singh
我在onScrollListener中使用了相同的方法,但它不起作用的原因是,当用户滚动到以前的日期时,我将数据插入到我的数据源并运行notifyItemInserted。一旦运行,findFirstVisibleItemPosition就会返回0。 - SudoPlz

2
以下是可以用于检查哪些项目是“可见”的线性/网格LayoutManager方法。最初的回答:
LinearLayoutManager layoutManager = ((LinearLayoutManager) mRecyclerView.getLayoutManager());

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

如果您想追踪某个阈值下的屏幕上是否可见的项目,表示用户已经花费足够的时间查看内容,则可以参考以下博客。这是一篇非常好的博客,演示了如何使用LayoutManager的滚动回调和RxJava订阅者来跟踪项目的可见性是否达到阈值。 原始答案:最初的回答

这些东西根本没有任何有意义的工作方式。 - user2782067
你所说的“任何有意义的方式”是什么意思?如果你有任何不起作用的场景,你可以在这里添加示例代码链接。 - Sumit Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接