更改viewPager滑动方向

Eli*_*ran 6 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());
            }
Run Code Online (Sandbox Code Playgroud)

简介:目前,当我向左滑动viewPager时,它会显示下一页.在RTL中,当您向右滑动viewPager时,它会显示下一页.

这可能很难理解,但在这里. 向右滑动即可显示下一页

向右滑动即可显示下一页

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

Ama*_*TeR 18

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

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

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

viewpager.setRotationY(180);
Run Code Online (Sandbox Code Playgroud)

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

recyclerView.setRotationY(180);
Run Code Online (Sandbox Code Playgroud)

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

这100%为我工作.

  • 这会反转viewpager中的所有视图 (3认同)
  • 因为您可能只旋转了一次布局.你必须旋转两次.父布局一旦比子布局.当然,它会正常工作. (2认同)

小智 10

我在一个月前面临同样的问题,但我认为我找到了一个很好的解决方案.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" />
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

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


had*_*adi 0

我知道已经晚了,但这是一个聪明的问题。正如@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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在是棘手的部分。您应该使用这个简单的方法,该方法使用最大索引和当前索引反转从零开始的索引顺序。

public int calculateReverse(int maxIndex,int currentIndex){
        return maxIndex-currentIndex;
    }
Run Code Online (Sandbox Code Playgroud)

您应该在 onTabSelected() 中使用此方法,如下所示:请注意,您应该使用自己的最大索引:

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

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

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

我试图尽可能地进行描述。希望这可以帮助 :)