如何以编程方式检测项目在RecyclerView中何时可见?

时间:2018-06-19 10:06:34

标签: java android android-recyclerview mpandroidchart

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

更多细节

我正在使用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

为RecyclerView的每个项目视图实现逻辑的唯一已知回调方法是onBindViewHolder。但问题是如果当前可见的项目位置是(假设)x,那么RecyclerView也会提前加载x + 1,以便滚动保持平滑。因此,在视图甚至对用户可见之前,也会执行动画项目视图(在我的情况下)的动画逻辑。因此,我需要一个回调方法,告诉我x位置(或)项目视图是"可见"给用户。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

对不起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,那么你的项目完全显示。

答案 1 :(得分: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()s();


}
});