如何将ViewPager的方向反转为从右到左?

5

我有一个包含多个视图的viewPager。viewPager的默认行为是首先显示第一项,然后向右滑动显示当前视图的右边的第二个视图等。

我想要的行为是,在显示第一项后,向左滑动会显示下一个视图,并将其显示在当前项的左侧

我搜索了很多聪明的方法来实现这个功能,但没有结果。提前感谢。

4个回答

8

但是每次滑动都要调用setCurrentItem吗?这样我不会失去viewPager的优势吗? - dvrm
如果你反转了视图列表并将当前项设置为最后一个视图,那么最后一个视图将被显示出来。现在,由于你已经反转了视图列表,这个最后一个视图将成为原始视图列表中的第一个视图...现在用户将无法向右移动,因为你已经在最后一个视图上了...用户只能向左移动以查看倒数第二个视图(原始列表中的第二个视图),倒数第三个视图(原始列表中的第三个视图)等等...我想这就是你想要的。 - Praful Bhatnagar
哦,你说得对。我写完后一秒钟就注意到了,试图删除我的评论,但你回答得更快。谢谢! - dvrm
问题在于当你为viewpager设置适配器时,默认情况下,它会创建OffsetLimit * Fragments以进行“预加载”。然后你将currentItem设置为最后一个,因此要求viewpager创建另外的OffsetLimit * Fragments...我找不到解决方法... - baramuse

3

当ViewPager被附加到视图时,您可以简单地使用setCurrentItem()导航到ViewPager中的最后一页。


我考虑过这种方式,但我的视图列表非常动态,而且根据滑动位置添加视图,因此使用setCurrentItem的方法会使它更加复杂。 - dvrm
你不应该需要动态添加视图;相反,使用Fragment,支持库将为您处理它们的生命周期。 - Paul Lammertsma
你是什么意思?我来概述一下我的做法:在vp(viewPager)中,我有一个视图是listView(在层次结构中较高的级别)。滑动考虑到被滑动的列表项,并向vp添加显示下一个级别层次结构的其他listView。向后滑动会删除最后一个listView。这个方法很好用,但现在我需要将vp反转为从左到右,我感到很尴尬。我正在寻找非“手动”的方法。你能帮我吗?我的英语不太好,你明白我的意思吗?非常感谢你花时间阅读。 - dvrm
我不确定你的意思,因为你同时提到了ViewPager和ListView。我建议阅读这篇关于使用Fragment的ViewPager的Android Dev Blog文章这篇博客文章提供了一个完整的示例,以及这个问题提供了一些有见地的评论。 - Paul Lammertsma
这是一个包含列表的ViewPager。我会学习你提供的链接,看看它是否有帮助。非常感谢! - dvrm
非常欢迎!如果您有具体的问题,我建议您提出一个新的问题。 - Paul Lammertsma

0

现在您可以在Recyclerview中水平显示项目。

有一个选项可以将recyclerview项目按相反的顺序显示。

RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, true)); // last parameter is isReverse

如果您想像ViewPager分页一样显示RecyclerView项,您应该使用这个库:

https://github.com/lsjwzh/RecyclerViewPager

这段代码将会把RecyclerView以反向ViewPager的形式展示。
以下是代码:
RecyclerViewPager recyclerViewPager = findViewById(R.id.recyclerViewPager);
recyclerViewPager.setLayoutManager(new LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, true));


repositories {
    ...
    maven { url "https://jitpack.io" }
    ...
}

dependencies {
    ...
    compile 'com.github.lsjwzh.RecyclerViewPager:lib:v1.1.2@aar'
    ...
}

0

ViewPager2的解决方案

我正在寻找一种反转ViewPager2的方法,并想出了这个。虽然有点取巧,但它确实有效。

思路是水平镜像ViewPager,然后再将每个页面镜像回来。

var ViewPager2.isReversedDirection: Boolean
get() = scaleX == -1f
set(value) {
    if (value) {
        scaleX = -1f  //  mirror viewpager

        val listener = object : RecyclerView.OnChildAttachStateChangeListener {
            override fun onChildViewDetachedFromWindow(view: View) = Unit

            override fun onChildViewAttachedToWindow(view: View) {
                view.scaleX = -1f  //  mirror the page back when it was attached
            }
        }

        val recyclerView = getChildAt(0) as RecyclerView
        recyclerView.addOnChildAttachStateChangeListener(listener)
    }
}

由于它依赖于viewpager的内部实现,因此在androidx.viewpager2:viewpager2:1.0.0上进行了测试。


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