Il setCurrentItem di ViewPager (pageId, true) NON scorrimento liscio

Sto compilando su SDK 4.03, Samsung Infuse Android 2.2, Libreria di supporto per Android 4, e utilizzando ViewPager nella mia applicazione, lo scorrimento effettivo funziona bene, ma quando lo faccio

viewPager.setCurrentItem(id); // , or viewPager.setCurrentItem(id, true); 

Non scorre liscia, ma consente di commutare immediatamente le visualizzazioni. Anche se la documentazione chiaramente afferma che questo è lo scopo di impostare il secondo argomento su true. Che cosa succede con questo?

  • Android - come disegnare la sfumatura a 2 direzioni?
  • Imansible eseguire il test di JUnit 4 nel progetto Android Eclipse
  • Come aggiungere listView all'interno di cardView android?
  • il file è crittografato o non è un database (Eccezione net.sqlcipher.database.SQLiteException)
  • android gonfia un layout contiene frammento
  • Autorizzazione della cartella specifica app per l'archiviazione esterna
  • Documentazione rapida di Android Studio sempre "carica la documentazione"
  • android image exif lettore 3rd party api
  • Errore: l'esecuzione non è rioutput per l'attività ': app: processDebugResources'. > java.io.IOException: Imansible eliminare la cartella "" nello studio android
  • Disegno inclinato o inclinato dell'interface utente in Android
  • Come faccio a get la differenza tra due date in android ?, provato each cosa e post
  • Come submit un messaggio di text a più di un numero?
  • 8 Solutions collect form web for “Il setCurrentItem di ViewPager (pageId, true) NON scorrimento liscio”

    Ho risolto questo problema creando un MyViewPager che sovrascrive il ViewPager.mScroller utilizzando la riflessione.

     public class MyViewPager extends ViewPager { public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); setMyScroller(); } private void setMyScroller() { try { Class<?> viewpager = ViewPager.class; Field scroller = viewpager.getDeclaredField("mScroller"); scroller.setAccessible(true); scroller.set(this, new MyScroller(getContext())); } catch (Exception e) { e.printStackTrace(); } } public class MyScroller extends Scroller { public MyScroller(Context context) { super(context, new DecelerateInterpolator()); } @Override public void startScroll(int startX, int startY, int dx, int dy, int duration) { super.startScroll(startX, startY, dx, dy, 1000 /*1 secs*/); } } } 

    Questo è ciò che ho fatto. smoothScrollTo metodo package-private smoothScrollTo in ViewPager inserendo la mia propria sottoclass personalizzata nello stesso pacchetto. È stato superato un valore di zero, il che provoca il comportmento di scatto invece del rotolo liscio.

     package android.support.v4.view; import android.content.Context; import android.util.AttributeSet; public class MyViewPager extends ViewPager { public MyViewPager(Context context) { super(context); } public MyViewPager(Context context, AttributeSet attr) { super(context, attr); } void smoothScrollTo(int x, int y, int velocity) { super.smoothScrollTo(x, y, 1); } } 

    Ha funzionato ottimo, se vuoi puoi calcolare e fornire velocità ISO effettiva di appena 1.

    Ho chiamato la function setCurrentItem in un gestore e ha funzionato bene per me.

     new Handler().post(new Runnable() { @Override public void run() { myViewPager.setCurrentItem(1, true); } }); 

    Spero che questo ti aiuti.

    Sono consapevole che questo thread è piuttosto vecchio, ma questo è uno dei migliori risultati di Google. Sto andando avanti e indietro su come risolvere questo problema per un po 'adesso. Nessuna delle soluzioni sopra mi ha aiutato affatto. Tuttavia, ho trovato una soluzione che funziona per me.

    Quello che la mia installazione attualmente sembra è una listview all'interno di un viewpager. Quando fai clic su una delle viste crea una nuova pagina e scorri verso di essa. Prima era molto snappy, ma sembra che sia perché stavo chiamando

     mViewPager.setCurrentItem(intIndex, true); 

    dall'interno del mio OnClickEvent. Il viewpager non piace questo per qualche ragione, quindi invece ho fatto questa function. Crea un nuovo thread che esegue un runnable sul thread UI. Questo runnable è ciò che dice a ViewPager di scorrere fino a un determinato elemento.

     public static void scrollToIndex(int index) { final int intIndex = index; //We're going to make another thread to separate ourselves from whatever //thread we are in Thread sepThread = new Thread(new Runnable(){ public void run() { //Then, inside that thread, run a runnable on the ui thread. //MyActivity.getContext() is a static function that returns the //context of the activity. It's useful in a pinch. ((Activity)MyActivity.getContext()).runOnUiThread(new Runnable(){ @Override public void run() { if (mSlidingTabLayout != null) { //I'm using a tabstrip with this as well, make sure //the tabstrip is updated, or else it won't scroll //correctly if(mSlidingTabLayout.getTabStripChildCount() <= intIndex) mSlidingTabLayout.updateTabStrip(); //Inside this thread is where you call setCurrentItem mViewPager.setCurrentItem(intIndex, true); } } }); } }); sepThread.start(); } 

    Spero di aver alless aiutato qualcuno a questo problema. In bocca al lupo!

    Modifica: guardando la mia risposta, sono abbastanza sicuro che puoi eseguire solo il thread ui e dovrebbe funzionare. Prendilo con un granello di sale però, non l'ho ancora provato.

    Ho avuto lo stesso problema, ma oggi ho trovato una soluzione semplice. Forse ti aiuterà. In primo luogo, supponiamo di avere un ViewPager che ha riempito l'integer schermo. Per passare da una pagina all'altro ho creato la mia propria vista personalizzata con le tabs e la metto sopra il ViewPager. Fare clic su una scheda deve scorrere senza problemi nella pagina appropriata di ViewPager con setCurrentItem (elemento, vero) – ma scorre immediatamente, senza alcun effetto liscio! Poi ho cercato di aggiungere un semplice button (non personalizzato) sopra il callback di ViewPager +:

     @Override public void onClick(View v) { viewPager.setCurrentItem(item, true); } 

    Dopo di che il rotolo liscio fissava il lavoro. Quindi, la soluzione è stata molto semplice: all'interno della class Button l'interno boolean onTouch (…) ascoltatore restituisce vero, quindi sempre CONSUMI gli events a contatto! Quindi il rotolo liscio ha iniziato a lavorare per la visualizzazione delle tabulazioni personalizzate quando ho sostituito "restituire false" con "restituire vero" nell'allenatore boolean onTouch (…).

    Spero che la mia storia di successo possa aiutarti.

    Il ViewPager è stato modificato molto dalla revisione da 5 a 9. Alcune di quelle modifiche che potrebbero essere correlate al problema:

    • Correzioni di bug per il comportmento dell'interface utente in ViewPager (revision 5 e 6)
    • Numerosi bug aggiuntivi per ViewPager (revisione 9)

    Dare che il tuo codice dovrebbe funzionare bene, la mia migliore ipotesi è che la tua libreria di supporto non sia aggiornata. Provare ad aggiornare la libreria se non lo è.

    Per coloro che utilizzano Xamarin (anche se questo approccio è applicabile anche a Java) posso suggerire di utilizzare l'approccio successivo in base alla risposta di cui sopra (ViewPager da Android Support Library v7 AppCompat 19.1.0):

     public void ScrollSmooth(int i) { var jClass = JNIEnv.GetObjectClass(_pager.Handle); var jMethod = JNIEnv.GetMethodID(jClass, "setCurrentItemInternal", "(IZZI)V"); JNIEnv.CallVoidMethod (_pager.Handle, jMethod, new JValue (i), new JValue (true), new JValue (false), new JValue (1)); } 

    Si basa sull'implementazione di ViewPager da http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/support/v4/view/ViewPager.java

    provare con questo codice:

     viewPager.postDelayed(new Runnable() { @Override public void run() { viewPager.setCurrentItem(id, true); } }, 100); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.