当前位置: 首页 > 知识库问答 >
问题:

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

万修然
2023-03-14

我的Android应用程序有一个带有PagerSnapHelper的RecyclizerView。每个项目的宽度和高度与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);
        }
    }
});

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

任何帮助都将不胜感激!

共有2个答案

贝财
2023-03-14

使用此代码:

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();
    
    
    }
});
融唯
2023-03-14

不好意思在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,那么您的项目将完全显示。

 类似资料:
  • 问题内容: 我已经看到这个问题问过其他平台/语言-有什么想法吗?我想做类似的事情: 我希望能够在调试时切换键盘输入作为脚本的开始,这样我就可以花点时间启动chrome来监听我的节点检查器端口。 ***快速更新-我猜我实际上可以使用“ process.argv”来检测–debug是否传入。这是最佳/正确的方法吗? 问题答案: 在调试模式下运行时,NodeJS创建一个全局对象: 因此,可能的解决方案是

  • 我正在尝试添加滑动删除功能,以及在长按RecyclerView项时显示底部工作表弹出窗口。我正在使用用于滑动删除,以及用于长按项目时显示弹出窗口。问题是,当我刷项目删除其也检测长按。我想要的是,当物品被刷卡时,它应该忽略长按。我有一个ItemTouchHelper类,它扩展了Simplecallback以进行滑动删除。以下是附加recyclerview以便刷卡删除的代码。 下面是为长点击事件添加监

  • 问题内容: 有没有一种方法可以使用C ++在Linux中以编程方式检测本地计算机上的IP地址更改? 问题答案: 在C中,要使用当前IP,请使用: 将“ eth0”替换为您正在查看的接口。您现在要做的就是轮询更改。

  • 我已经尝试过使用GCP控制台仪表板创建项目,我想通过使用Google支持的API来管理项目,以编程方式创建项目。然后我想通过使用.NET项目的Big Query客户端库来执行Google Big Query操作。 有没有办法通过使用谷歌云API服务来创建谷歌云平台“项目”?

  • 我能够从照片中捕捉颜色的RGB值,但我希望能够通过编程检测该颜色是红色、橙色、黄色、绿色、蓝色、紫色、棕褐色还是白色或黑色。 所以我需要指定返回的RGB范围,例如,红色的值。。。或者蓝色。。。等等我现在有类似的东西,但它不包括所有可能的RGB品种。 红色 R=255,克 R=255,G=0,B 橙色 R=255,克 R=240,G=255,B=0 等等 有人知道如何获取任何RGB值,并检测它是红色

  • 问题内容: 一次只显示一个标签。用户使用鼠标/键盘选择一个。假设TabPane上有三个选项卡,并且第一个有一个按钮。当用户按下按钮时,我希望打开第二个选项卡。然后必须有一些代码才能切换到绑定到该按钮的第二个Tab。 有可能以编程方式吗?如果是这样,怎么办? 问题答案: 尝试 要么 要么 要么…