2015-09-07 4 views
6

Я использую TabLayout и viewPager с возможностью прокрутки viewPager влево или вправо, чтобы перемещаться между страницами.Изменение направления прокрутки viewPager

Моя проблема заключается в том, что мое приложение основано на RTL (справа налево), а направление движения - наоборот.

Я пытаюсь изменить направление движения от версии по умолчанию до обратной версии. Я искал много в Интернете и не мог найти способ, как это сделать.

Я использую android.support.v4.view.ViewPager;

и это, как я инициализировать мой TabLayout с ViewPager:

// 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 справа показывает следующей странице

Swiping right shows the next page

в то время как мне нужно ударяя право показывать предыдущую страницу.

+0

Разве это не вопрос содержимого «PagerAdapter» в обратном порядке? – CommonsWare

+2

Почему не просто setCurrentItem для последнего элемента? – Chris

+0

@CommonsWare И что происходит, когда я сажусь влево? Разве мне не нужно менять onScrollListener для этого? (тот же ответ вам Крис) Мне нужно изменить направление прокрутки viewPager (прокрутка вправо - следующая страница, прокрутка влево - предыдущая страница). теперь он отменен. Закладки работают отлично, если я их выбираю. прокрутка viewPager - нет. – Eliran

ответ

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

Я старался быть настолько наглядным, насколько могу. надеюсь, это поможет :)

8

Я столкнулся с той же проблемой месяц назад, но я думаю, что нашел отличное решение. 1) Изменить направление TabLayout к LTR в 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) Создание пользовательского адаптера для ViewPager и переопределить методы GetItem (целое положение) и getPageTitle (INT позиция):

@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

8

Это очень простой techniqe изменить направление взмахом ViewPager.

Есть два простых шага, которые должны следовать за вами,

1. Изменить вращение Посмотреть пейджера,

viewpager.setRotationY(180); 

2. Затем снова изменить направление фрагмента контейнер, который является ребенком смотрителя,

recyclerView.setRotationY(180); 

Примечание: В моем случае я использовал recyclerview как дочерний элемент пейджера представления.

Это на 100% работает для меня.

+1

это обратное все виды внутри viewpager –

+1

Потому что возможно, вы развернули свой макет только один раз. Вы должны повернуть дважды. После родительского макета, чем макет ребенка. Определенно, он будет работать должным образом. –

+0

Любая идея о том, как повернуть текст в PagerTitleStrip обратно в нормальное состояние, получила ожидаемое поведение при повороте просмотров дважды .... но заголовок полосы пейджера при повороте 180 переключает родительское направление просмотра только заголовка, но не текст – skryshtafovych

Смежные вопросы