studio programacion herramientas fundamentos con avanzado aplicaciones android android-viewpager android-tablayout

programacion - manual de android en pdf



Cambio de la dirección del deslizamiento de la vista del visor (3)

Estoy usando TabLayout y viewPager con una opción para deslizar viewPager hacia la izquierda o hacia 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 del deslizamiento está invertida.

Estoy tratando de cambiar la dirección de deslizamiento de la predeterminada a la versión invertida. He estado buscando mucho en la web y no he podido encontrar la manera de hacerlo.

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

y así es como inicializo mi TabLayout con 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 deslizo viewPager hacia la izquierda, muestra la página siguiente. en RTL, cuando desliza el viewPager hacia la derecha, muestra la página siguiente.

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

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


Sé que es tarde, pero esta es una pregunta inteligente. como @CommonsWare dijo que es 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 cuando invierte 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 usar este método simple que convierte el orden de índice basado en cero revertido utilizando el índice máximo y el índice actual.

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

de lo que debería usar este método en onababselected () como este: tenga en cuenta que debe usar 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 oyente de la página en el adaptador de página. una vez más deberías usar tu propio número de índice máximo:

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

Traté de ser lo más descriptivo posible. espero que esto ayude :)


Me enfrenté al mismo problema hace un mes, pero creo que encontré una gran solución. 1) Cambie su dirección 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) Cree un adaptador personalizado para ViewPager y anule los 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 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) Creé una publicación de blog que contiene más detalles y código completo - aquí


Es la técnica más simple para cambiar la dirección de deslizamiento del Viewpager.

Hay dos pasos simples que deben seguirte,

1. Cambie la rotación del paginador de visualización,

viewpager.setRotationY(180);

2. Luego, cambie nuevamente la dirección del contenedor de fragmentos que es el elemento secundario de viewpager,

recyclerView.setRotationY(180);

Nota: En mi caso, he utilizado recyclerview como el elemento secundario del buscador de vistas.

Esto es 100% trabajado para mí.