Java 如何以编程方式检测项目何时在RecyclerView中可见?
我的Android应用程序有一个带有PagerSnapHelper的RecyclerView。每个项目的宽度和高度都与父项匹配。因此,页面上只保留1个视图项。我很想知道用户何时可以完全看到特定的视图项。我想对该视图执行一些操作 更多细节 我使用库在每个视图项中显示图表。我也在制作这些图表的动画。但是,由于RecyclerView加载的某些视图项恰好与当前可见的视图项相邻,因此动画会在视图对用户可见之前发生。因此,我需要一个回调方法来确定特定的视图项对用户是可见的。这样我就可以在那个时候制作图表的动画 代码 我尝试了以下方法来确定当前可见的项目视图是什么。但这并没有解决我的问题:Java 如何以编程方式检测项目何时在RecyclerView中可见?,java,android,android-recyclerview,mpandroidchart,Java,Android,Android Recyclerview,Mpandroidchart,我的Android应用程序有一个带有PagerSnapHelper的RecyclerView。每个项目的宽度和高度都与父项匹配。因此,页面上只保留1个视图项。我很想知道用户何时可以完全看到特定的视图项。我想对该视图执行一些操作 更多细节 我使用库在每个视图项中显示图表。我也在制作这些图表的动画。但是,由于RecyclerView加载的某些视图项恰好与当前可见的视图项相邻,因此动画会在视图对用户可见之前发生。因此,我需要一个回调方法来确定特定的视图项对用户是可见的。这样我就可以在那个时候制作图表的
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState != RecyclerView.SCROLL_STATE_DRAGGING) {
View centerView = snapHelper.findSnapView(linearLayoutManager);
BarChart barChart = centerView.findViewById(R.id.barChart);
barChart.animateXY(ChartUtil.TIME, ChartUtil.TIME);
}
}
});
编辑1
为RecyclerView的每个项目视图实现逻辑的唯一已知回调方法是
onBindViewHolder
。但问题是,如果当前可见的项目位置是(假设)x,那么RecyclerView也会提前加载x+1,以便滚动保持平滑。因此,项目视图动画的逻辑(在我的例子中)也在视图对用户可见之前执行。因此,我需要一个回调方法,告诉我x位置(或)项视图对用户是“可见的”
任何帮助都将不胜感激 很抱歉在Kotlin上给出了答案,我现在无法在Java上快速查看。但我希望它也是可读的:
recycler_view.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (layoutManager.findViewByPosition(layoutManager.findFirstVisibleItemPosition()).y == 0) {
// Do what you need
}
}
})
所以你们只需要找到第一个可见位置的偏移量。如果它等于0,则项目将完全显示。使用以下代码:
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
LinearLayoutManager linearLayoutManager= (LinearLayoutManager) recyclerView.getLayoutManager();
linearLayoutManager.findFirstCompletelyVisibleItemPosition();
linearLayoutManager.findLastCompletelyVisibleItemPosition();
}
});
读了你的问题后,我觉得你想在获取特定视图的数据后在循环视图中显示项目?对吗?@ShravanJain不,我有数据。数据的大小保持不变。但是,由于RecyclerView在可见项的左/右两侧加载的项目很少,因此图表(RecyclerView的项目视图内部)在用户实际可见之前加载并设置动画。因此,我想知道用户是否可以看到项目视图,以便在那一刻我可以为图表设置动画。好的。因此,必须有一个类,在该类中实现了回收视图的特定项的视图。您可以很容易地将其逻辑放在那里。唯一已知的为recyclerView的每个项目视图实现我的逻辑的回调方法是
onBindViewHolder
。但问题是,如果当前可见的项目位置是(假设)x,那么recyclerView也会提前加载x+1,以便滚动保持平滑。因此,在视图对用户可见之前,也会执行项目视图的动画逻辑。因此,我需要一个回调方法来告诉我某个特定视图是否对用户“可见”。否。请仔细阅读我的问题。我试过这种方法。它不起作用。如果您认为我在当前的实现中缺少一些要点,请您在回答中添加更多内容。谢谢您的回答,我将不得不对您的解决方案进行更多思考,以告诉您它是否有效。请给我一点时间。@MayankMohanUpadhyay没关系。如果答案对你有效,请接受。如果你有什么问题尽管问。不,这对我不管用。我今天找到了一个有效的解决办法。我会把它寄出去的。不,还没有。由于没有答案,我暂停了那项工作。将再次搜索。