Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以编程方式检测项目何时在RecyclerView中可见?_Java_Android_Android Recyclerview_Mpandroidchart - Fatal编程技术网

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

Java 如何以编程方式检测项目何时在RecyclerView中可见?,java,android,android-recyclerview,mpandroidchart,Java,Android,Android Recyclerview,Mpandroidchart,我的Android应用程序有一个带有PagerSnapHelper的RecyclerView。每个项目的宽度和高度都与父项匹配。因此,页面上只保留1个视图项。我很想知道用户何时可以完全看到特定的视图项。我想对该视图执行一些操作 更多细节 我使用库在每个视图项中显示图表。我也在制作这些图表的动画。但是,由于RecyclerView加载的某些视图项恰好与当前可见的视图项相邻,因此动画会在视图对用户可见之前发生。因此,我需要一个回调方法来确定特定的视图项对用户是可见的。这样我就可以在那个时候制作图表的

我的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没关系。如果答案对你有效,请接受。如果你有什么问题尽管问。不,这对我不管用。我今天找到了一个有效的解决办法。我会把它寄出去的。不,还没有。由于没有答案,我暂停了那项工作。将再次搜索。