不滚动地打开ViewPager2到特定位置

12

我已经实现了一个带有视频的RecyclerView(假设有10个视频)。 点击任何项目会打开另一个Activity上的ViewPager2,其中包含所有项目和被点击的项目(来自RecyclerView)。用户可以从那里滚动到其他项目。一切都很好工作。

唯一的问题是当在RecyclerView项单击并打开ViewPager2时,滚动存在问题。

每当选择任何项目(第10个),ViewPager首先打开并滚动到(第10个)位置。 我想直接打开ViewPager2的第10个位置而不进行滚动。任何帮助都将不胜感激。

我尝试设置当前项为

viewPagerReview.currentItem = recyclerviewItemSelectedPosition

但如果当前项是RecyclerView的最后一个位置,则ViewPager也会滚动到最后一个位置。


你能分享更多的代码吗?问题似乎很清楚,但如果你能分享更多的代码会更有帮助。在RecyclerView中有一个方法可以进行非平滑滚动。你看不到它滚动,它会直接带你到你想要的位置。 - Nizar
你尝试过 recyclerView.layoutManager.scrollToPosition 吗? - Nizar
不,不使用RecyclerView。直接使用位置和列表数据在ViewPager2中进行查看。假设,如果RecyclerView有15个项目,并且我点击第10个,则ViewPager会在另一个活动中打开并滚动到第10个位置,因为有viewPagerReview.currentItem = recyclerviewItemSelectedPosition代码。 - Narendra Pal
recyclerView.layoutManager.scrollToPosition并将转换/动画设置为null是正确的做法。 - Faizan Tariq
@FaizanTariq 如何将过渡/动画设置为null? - Narendra Pal
显示剩余4条评论
2个回答

32

根据 AndroidDocs 上的 ViewPager2setCurrentItem(item: Int) 的作用是:

设置当前选择的页面。如果 ViewPager 已经使用当前适配器完成了第一次布局,则当前项和指定项之间将有平滑的动画过渡。

因此,在您的情况下,您需要使用另一个方法:setCurrentItem(item: Int, smoothScroll: Boolean),以指定是否要进行平稳滚动 (smoothScroll)。

所以,在您的情况下,请使用以下代码:

viewPagerReview.setCurrentItem(recyclerviewItemSelectedPosition, false)

我很高兴它能够成功 @NarendraPal :) - Nizar
4
但实际上,这并不能可靠地工作。有时它会选择正确的页面,有时不会。可能是因为在事件驱动的 Android 混乱环境中存在竞争条件。我不得不使用 postDelayed() 函数稍微延迟一下,但请注意这是一个恶劣的 hack,不能保证在每台设备上都能正常工作 :( - Jiří Křivánek
1
@JiříKřivánek 这不是黑客行为,而是一种实际的正确方法。现在我不知道竞争条件。有可能这种方法会干扰其他东西,从而导致这种竞争条件。你能否与我分享一个项目、一些代码或一个 Github 存储库,在这里发生这种情况?如果可以,请尽快...我很想看看你面临的确切问题。 - Nizar
2
直到我更新到"androidx.viewpager2:viewpager2:1.1.0-alpha01",它才开始对我起作用。 - patrick-fitzgerald
1
一样的情况。第一次调用时无法重现。切换到1.1.0-alpha01有所帮助。 - Flo rian

0

这个问题的正确解决方案是按照以下步骤进行操作:

使用setCurrentItem(item :Int, smoothScroll : Boolean)方法

viewPager.setCurrentItem(2, false)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接