更改viewPager滑动方向

时间:2015-09-07 17:26:33

标签: android android-viewpager android-tablayout

我使用TabLayout和viewPager,并选择向左或向右滑动viewPager,以便在页面之间导航。

我的问题是,我的应用程序是基于RTL的(从右到左),滑动方向是相反的。

我试图将滑动方向从默认版更改为反转版。 我一直在网上搜索很多,但却找不到办法。

我正在使用android.support.v4.view.ViewPager;

这就是我用viewPager初始化我的TabLayout的方法:

// View Page Adapter
        final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
        final PagerAdapter adapter = new PagerAdapter
                (getSupportFragmentManager(), tabLayout.getTabCount());
        //View Page Adapter Configuration
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        viewPager.setOffscreenPageLimit(3);
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

摘要:目前,当我向右滑动viewPager时,它会显示下一页。 在RTL中,当您向右滑动viewPager时,它会显示下一页。

可能很难理解,但现在就是这样。 向右滑动即可显示下一页

Swiping right shows the next page

虽然我需要向右滑动以显示上一页

5 个答案:

答案 0 :(得分:18)

更改Viewpager的滑动方向是非常简单的技术。

有两个简单的步骤必须跟着你,

1。更改View寻呼机的旋转,

viewpager.setRotationY(180);

2. 然后再次更改作为viewpager子项的片段容器的方向,

recyclerView.setRotationY(180);

注意:在我的情况下,我使用了recyclerview作为视图寻呼机的子项。

这是100%为我工作。

答案 1 :(得分:9)

我在一个月前遇到了同样的问题,但我认为我找到了一个很好的解决方案。 1)将您的TabLayout方向更改为xml中的ltr:

<android.support.design.widget.TabLayout
    android:id="@+id/tl_activity_main"
    android:layout_below="@id/toolbar_activity_main"
    android:layoutDirection="ltr"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    style="@style/DisionTabLayout" />

2)为ViewPager创建自定义适配器并覆盖方法getItem(int position)和getPageTitle(int position):

@Override
public Fragment getItem(int position) {
    if (mIsRtlOrientation && mTabs != null && mTabs.length > 0) {
        return mTabs[mTabs.length - position - 1].getFragment();
    } else {
        return mTabs[position].getFragment();
    }
}

@Override
public int getCount() {
    return mTabs.length;
}

@Override
public CharSequence getPageTitle(int position) {
    if (mIsRtlOrientation && mTabs != null && mTabs.length > 0) {
        return mTabs[mTabs.length - position - 1].getTitle();
    } else {
        return mTabs[position].getTitle();
    }
}

3)将适配器设置为ViewPager,然后将此ViewPager应用于TabLayout。

private void setAdapters() {
    // initialize adapter
    mTabsAdapter = new TabsAdapter(getSupportFragmentManager(), mTabs, true);
    // set adapter to ViewPager
    vp.setAdapter(mTabsAdapter);
    // set ViewPager to TabLayout
    tl.setupWithViewPager(vp);
    // if RTL orientation, go to last item
    vp.setCurrentItem(vp.getAdapter().getCount() - 1, false);
}

4)我创建了一篇博文,其中包含更多详细信息和完整代码 - here

答案 2 :(得分:0)

如果将viewpager2与片段一起使用。您可以使用。

<androidx.viewpager2.widget.ViewPager2
        android:id="@+id/pager"
        android:layout_width="0dp"
        android:layout_height="0dp"
        **android:orientation="vertical"**
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

我希望这对某人有帮助。

答案 3 :(得分:0)

你不能使用ViewPager2,它支持从右到左的方向。使其成为可能:

  1. 在应用清单中添加 android:supportsRtl="true"
  2. 使 viewpager2 的父视图组布局方向为 ltr (android:layoutDirection="ltr")
  3. 现在设置 viewpager2 的 layoutDirection ltr (android:layoutDirection="rtl")
  4. 还将适配器的布局设置为 layoutDirection ltr (android:layoutDirection="ltr")

答案 4 :(得分:-1)

我知道它已经很晚了,但这是一个聪明的问题。正如@CommonsWare所说,它是在页面适配器中反转getItem()方法中项目顺序的问题。但这并不值得。当您在getitem()方法中反转顺序时,您也不应该反转getPageTitle()方法中的顺序。像这样的东西:

public static class AppSectionsPagerAdapter extends FragmentStatePagerAdapter {
        public AppSectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return new page1();
                case 1:
                    return new page2();
                case 2:
                    return new page3();
            }
        }

        @Override
        public CharSequence getPageTitle(int position) {
            switch (position) {
                case 0:
                    return "page 3 title";
                case 1:
                    return "page 2 title";
                case 2:
                    return "page 1 title";
                }
        }

        @Override
        public int getCount() {
            return 3;
        }
    }

现在是棘手的部分。你应该使用这个简单的方法,它使用最大索引和当前索引转换基于零的索引顺序。

public int calculateReverse(int maxIndex,int currentIndex){
        return maxIndex-currentIndex;
    }

比你应该在onTabSelected()中使用这个方法:请注意你应该使用自己的最大索引:

@Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
        mViewPager.setCurrentItem(calculateReverse(2,tab.getPosition()));
    }

第二部分是在页面适配器上更改页面侦听器。再一次,您应该使用自己的最大索引号:

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(calculateReverse(2,position));  // reversing the tab selection
            }
        });

我试着像我一样描述。希望这会有所帮助:)