如何以编程方式检测项目何时在回收器视图中可见?



我的Android应用程序有一个带有PagerSnapHelper的RecyclerView。每个项目的宽度和高度都match_parent。因此,页面上仅保留 1 个视图项。我有兴趣知道特定视图项何时对用户完全可见。我想对该视图执行一些操作。

更多详情

我正在使用MpAndroidChart库在每个视图项目中显示图表。我也在为这些图表制作动画。但是,由于 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

用于实现回收器视图的每个项目视图的逻辑的唯一已知回调方法是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();


}
});

最新更新