在不滚动的情况下将 ViewPager2 打开到特定位置

Posted

技术标签:

【中文标题】在不滚动的情况下将 ViewPager2 打开到特定位置【英文标题】:Open ViewPager2 to particular position without scrolling 【发布时间】:2020-05-06 16:40:40 【问题描述】:

我用一些视频实现了一个 recyclerview(比如 10 个)。单击任何项​​目都会打开一个viewpager2 which is on some other activity,其中包含所有项目and,其中显示了被单击的项目(来自recyclerview)。之后,用户只能从那里滚动到其他项目。一切正常。

只有当recyclerview项目点击viewpager2在哪里打开时滚动出现问题。

无论何时选择任何项目(第 10 位)。 viewpager 首先打开,然后滚动到(第 10 个)位置。我想直接打开viewpager2的第10个位置而不滚动。任何帮助,将不胜感激。

我已经尝试将当前项目设置为

viewPagerReview.currentItem = recyclerviewItemSelectedPosition

但如果当前项目是 recyclerview 的最后一个位置,那么 viewpager 也会滚动到最后一个位置。

【问题讨论】:

你能分享更多你的代码吗?问题似乎很清楚。但是,如果可以的话,它会更有帮助。 RecyclerView 中有一个方法可以在没有平滑滚动的情况下滚动。你不会看到它滚动,它会直接把你带到你想要的位置。 你试过recyclerView.layoutManager.scrollToPosition吗? @Nizar 好的,我认为我的问题在这里有点令人困惑。问题在于 viewpager2 滚动。我没有在这里滚动回收站视图。需要打开在回收站列表中选择位置的其他活动上的 viewpager。感谢您快速回复。我已经编辑了我的问题。 其实你很清楚,我没有。根据 androidWiki,viewpager2 在您设置 currentItem 时有一个默认的 smoothScroll。现在我的问题是,您是否考虑传递 selectedPosition 并使用 RecyclerView 滚动到它? 不,不是回收站视图。只需直接使用位置和列表数据到 viewpager2 即可。假设,如果回收站视图有 15 个项目并且我单击第 10 个,则 viewpager 在另一个活动中打开并由于viewPagerReview.currentItem = recyclerviewItemSelectedPosition 代码滚动到第 10 个位置。 【参考方案1】:

好吧,根据 AndroidDocs 上的ViewPager2,setCurrentItem(item: Int) 会这样做:

设置当前选中的页面。如果 ViewPager 已经通过其当前适配器的第一个布局,则当前项和指定项之间将有一个平滑的动画过渡。

因此,您将要使用另一种方法,即setCurrentItem(item: Int, smoothScroll: Boolean) 来指定是否要使用smoothScroll

所以,就你而言,选择:

viewPagerReview.setCurrentItem(recyclerviewItemSelectedPosition, false)

【讨论】:

我很高兴它做到了@NarendraPal :) 但这实际上并不可靠。有时它会选择正确的页面,有时则不会。可能是事件驱动的 Android 混乱中的竞争条件。我不得不使用 postDelayed() 将其延迟一点,但请注意,这是一个讨厌的 hack,不能保证它适用于所有设备:( @JiříKřivánek 这不是黑客,这是使用的实际正确方法。现在我不知道比赛条件。该方法有可能会干扰导致这种竞争条件的其他因素。有什么方法可以与我分享发生这种情况的项目或一些代码或 github 存储库?如果可以,请这样做...我很想看看您所面临的问题。 在我更新到"androidx.viewpager2:viewpager2:1.1.0-alpha01"之前它对我不起作用 这里也一样。它在第一次通话时可重现地不起作用。切换到 1.1.0-alpha01 有帮助

以上是关于在不滚动的情况下将 ViewPager2 打开到特定位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在不手动滚动的情况下将 HMSegmentedControl 水平滚动到所选索引

如何在不破坏滚动功能的情况下将 UIImage 添加到 UIScrollView?

如何在不滚动的情况下将项目添加到 ListView 的开头?

在不中断用户滚动的情况下将单元格添加到 UITableView 的顶部

我可以在不膨胀/重新膨胀布局的情况下将视图添加到滚动视图吗?

如何在不打开的情况下将数据发送到另一个活动