Cambiar la dirección de desplazamiento de viewPager

Estoy usando TabLayout y viewPager con una opción para deslizar el viewPager a la izquierda oa la derecha para navegar entre las páginas.

Mi problema es que mi aplicación está basada en RTL (de derecha a izquierda) y la dirección de desplazamiento es invertida.

Estoy tratando de cambiar la dirección de desplazamiento de la versión predeterminada a la versión invertida. He estado buscando mucho en la web y no podía encontrar una manera de cómo hacerlo.

Estoy usando android.support.v4.view.ViewPager;

Y así es como inicializo mi TabLayout con el 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()); } 

Resumen: Actualmente, cuando estoy desplazando el viewPager hacia la izquierda, se muestra la página siguiente. En RTL, cuando desliza el viewPager hacia la derecha, muestra la siguiente página.

Puede ser difícil de entender, pero aquí está. Bajar a la derecha muestra la página siguiente

Bajar a la derecha muestra la página siguiente

Mientras que necesito deslizar derecha para mostrar la página anterior .

Me enfrenté al mismo problema hace un mes, pero creo que encontré una gran solución. 1) Cambie la dirección de TabLayout a ltr en 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) Crear un adaptador personalizado para ViewPager y sobreescribir métodos getItem (int position) y 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) Configure el adaptador en ViewPager y luego aplique este ViewPager a 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) He creado una entrada en el blog que contiene más detalles y código completo – aquí

Es la técnica muy simple para cambiar la dirección de desplazamiento del Viewpager.

Hay dos pasos simples que tienen que seguir,

1. Cambie la rotación del buscapersonas View,

 viewpager.setRotationY(180); 

2. A continuación, cambie de nuevo la dirección del contenedor de fragmentos que es el hijo de viewpager,

 recyclerView.setRotationY(180); 

Nota: En mi caso he usado recyclerview como el hijo del paginador de vista.

Esto es 100% trabajado para mí.

Sé que es tarde, pero esta es una pregunta inteligente. Como @CommonsWare dijo que es la cuestión de invertir el orden de los elementos en el método getItem () en el adaptador de página. Pero esto no es suficiente. Al invertir el orden en el método getitem (), tampoco debe invertir el orden en el método getPageTitle (). algo como esto:

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

Ahora viene la parte difícil. Debe utilizar este método simple que convierte orden de índice basado en cero invertido utilizando el índice máximo y el índice actual.

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

Que debe utilizar este método en onTabSelected () así: tenga en cuenta que debe utilizar su propio índice máximo:

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

La segunda parte es cambiar el listener de página en el adaptador de página. Una vez más usted debe utilizar su propio número máximo de índice:

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

Traté de ser tan descriptivo como puedo. espero que esto ayude 🙂

  • Diferencia entre FragmentPagerAdapter con ViewPager con OffScreenLimit establecido en 1 y FragmentStatePagerAdapter?
  • ¿Cómo escribir el método onClick en el viewpager?
  • Cambiar el color de desplazamiento excesivo de ViewPager
  • Guardar estado de fragmento en ViewPager
  • Android: pestañas sin barra de acción
  • Problemas con FragmentPagerAdapter
  • Desplazamiento de imágenes (no de diseños) con viewpager
  • ¿Por qué parpadean los iconos / textos de las lengüetas de TabLayout al pasar entre páginas?
  • Desafío: Animación personalizada de ViewPager. Cambiar la altura de los elementos elegidos (Ver doble)
  • Dynamic Center Aligned ViewPager
  • PagerTabStrip: cambia el ancho de la pestaña
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.