2015-09-07 23 views
6

Sto usando TabLayout e viewPager con un'opzione per scorrere il viewPager verso sinistra o destra per navigare tra le pagine.Cambiare viewPager swipe direzione

Il mio problema è che la mia applicazione è basata su RTL (da destra a sinistra) e la direzione di scorrimento è invertita.

Sto provando a cambiare la direzione di scorrimento dalla versione predefinita alla versione invertita. Ho cercato molto sul web e non sono riuscito a trovare un modo per farlo.

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

ed è così che ho inizializzare il mio TabLayout con la 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()); 
      } 

Sommario: Attualmente, Quando sto strisciando la viewPager verso sinistra, mostra la pagina successiva. in RTL, quando si scorre il viewPager a destra, mostra la pagina successiva.

Potrebbe essere difficile da capire, ma eccolo qui. Swiping destra mostra la pagina successiva

Swiping right shows the next page

mentre ho bisogno scorrendo a destra per visualizzare la pagina precedente .

+0

Non si tratta solo di avere il contenuto di 'PagerAdapter' nell'ordine inverso? – CommonsWare

+2

Perché non solo setCurrentItem sull'ultimo elemento? – Chris

+0

@CommonsWare E cosa succede quando passo il dito verso sinistra? Non ho bisogno di cambiare onScrollListener per questo? (stessa risposta a te Chris) Devo cambiare la direzione di scorrimento di viewPager (scorrendo a destra - pagina successiva, scorrendo a sinistra - pagina precedente). ora è invertito. Le schede funzionano perfettamente se ne seleziono una. lo swip di viewPager non lo fa. – Eliran

risposta

-1

so che è tardi ma questa è una domanda intelligente. come @CommonsWare ha detto che è questione di invertire l'ordine degli elementi nel metodo getItem() nell'adattatore di pagina. ma questo non è sufficiente. non appena si inverte l'ordine nel metodo getitem(), NON si deve invertire l'ordine nel metodo getPageTitle(). qualcosa del genere:

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

ora arriva la parte difficile. dovresti usare questo semplice metodo che converte l'ordine dell'indice a base zero invertito usando l'indice massimo e l'indice corrente.

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

quanto deve utilizzare questo metodo in onTabSelected() in questo modo: essere consapevoli è necessario utilizzare il proprio indice di massima:

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

la seconda parte è quello di cambiare pagina ascoltatore su adattatore pagina. ancora una volta dovresti usare il tuo numero indice massimo:

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

ho cercato di essere il più descrittivo possibile. spero che questo aiuti :)

8

Ho affrontato lo stesso problema mesi fa, ma penso di aver trovato un'ottima soluzione. 1) Modificare la direzione TabLayout 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) Creare adattatore personalizzato per ViewPager e sostituire i metodi getItem (int position) e 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) Impostare l'adattatore su ViewPager e quindi applicare questo 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) Ho creato un post sul blog, che contiene ulteriori dettagli e il codice completo - here

8

E 'molto semplice techniqe per cambiare la direzione del colpo di Viewpager.

ci sono due semplici step che devono seguirti,

1. modificare la rotazione della vista cercapersone,

viewpager.setRotationY(180); 

2. Poi di nuovo cambiare la direzione del frammento contenitore che è il figlio di viewpager,

recyclerView.setRotationY(180); 

Nota: Nel mio caso ho usato recyclerview come figlio del cercapersone.

Questo è al 100% ha funzionato per me.

+1

questo invertire tutte le viste all'interno del viewpager –

+1

Perché forse hai ruotato il tuo layout solo una volta. Devi ruotare due volte. Una volta layout genitore rispetto al layout figlio. Sicuramente, funzionerà correttamente. –

+0

Qualche idea su come ruotare il testo in PagerTitleStrip sul normale comportamento previsto quando si ruotano le visualizzazioni due volte .... ma la striscia del titolo del cercapersone quando ruota 180 cambia la direzione della vista genitore solo della striscia del titolo ma non il testo – skryshtafovych

Problemi correlati