Changing viewPager swipe direction

后端 未结 4 779
醉话见心
醉话见心 2020-12-29 12:47

I\'m using TabLayout and viewPager with an option to swipe the viewPager to the left or right in order to navigate between pages.

My problem is, that my application

相关标签:
4条回答
  • 2020-12-29 13:18

    i know it's late but this is a smart question. as @CommonsWare said it's the matter of reversing the order of items in getItem() method in page adapter. but this isn't enought. as you reverse the order in getitem() method you should also NOT reverse the order in getPageTitle() method. something like this:

    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;
            }
        }
    

    now comes the tricky part. you should use this simple method which converts zero based index order reversed using max index and current index.

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

    than you should use this method in onTabSelected() like this: be aware you should use your own max index:

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

    the second part is to change page listener on page adapter. once again you should use your own max index number:

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

    i tried to be as descriptive as i can. hope this helps :)

    0 讨论(0)
  • 2020-12-29 13:36

    It is the very simple techniqe to change the swipe direction of the Viewpager.

    There are two simple step which have to follow you,

    1. Change the rotation of the View pager,

    viewpager.setRotationY(180);
    

    2. Then again change the direction of the fragment container which is the child of viewpager,

    recyclerView.setRotationY(180);
    

    Note: In my case I have used recyclerview as the child of the view pager.

    This is 100% worked for me.

    0 讨论(0)
  • 2020-12-29 13:42

    I faced the same problem month ago but I think I found a great solution. 1) Change your TabLayout direction to ltr in xml:

    <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) Create custom adapter for ViewPager and override methods getItem(int position) and 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) Set the adapter to ViewPager and then apply this ViewPager to 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) I created a blog post which contains more details and full code - here

    0 讨论(0)
  • 2020-12-29 13:45

    If you are using viewpager2 with fragments. you can use.

    <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" />
    

    I hope this helps somebody.

    0 讨论(0)
提交回复
热议问题