2012-08-17 8 views
13

Uso un PagerAdapter. Ho molti elementi quindi non carico tutti gli elementi nello stesso tempo. Ricarico l'adattatore, cambio i vecchi elementi con i nuovi elementi. Ad esempio, ho 4 elementi, quando arrivo all'ultimo elemento, ricarico gli elementi e chiamo setCurentItem (1) per poter mostrare il viewpager nella posizione uno. Ho fatto un sacco di test. I mettere:setCurrentItem in ViewPager non scorre immediatamente nella posizione corretta

viewPager.setCurrentItem(1,false); //But not scroll, put drastically the new page. 
viewPager.setCurrentItem(1); 

ho cercato di modificare onPageScrollStateChanged (int arg0), ho solo 3 visite e sempre ubicate nel mezzo.

if (arg0 == ViewPager.SCROLL_STATE_DRAGGING) { 
    if(focusedPage==2) { 
     //Modify adapter 
     viewPager.setCurrentItem(1,false); 

    }else if(focusedPage==0){ 
     //Modify adapter 
     viewPager.setCurrentItem(1,false); 
    } 

E ho provato a modificare onPageSelected (int arg0)

focusedPage=arg0; 

Utilizzando questo ultimo esempio ho scorrere il punto di vista immediatamente, ma sempre si trova nell'ultima pagina. Qualcuno sa come posso scivolare.

Grazie

risposta

43

posso sapere di più sui retroscena di ciò che si sta cercando di realizzare?

Ad ogni modo, da quello che posso capire stai provando a fare un "infinito" ViewPager passando dall'ultimo al primo e viceversa (correggimi se sbaglio). E vuoi il tuo ViewPager per andare alla prima pagina, ma scorrere - non solo apparire dal nulla.

Bene, se si disattiva lo scorrimento fluido (il secondo parametro), quindi andrà direttamente alla pagina desiderata senza alcun movimento di scorrimento (e non "cambierà" sulle altre pagine sulla strada), e se abiliti lo scroll scorrevole, poi passerà attraverso tutte le viste, quindi vedrai come non era il prossimo ma il primo.

/*No swipe animation, and no onPageChanged for the page in the middle*/ 
    mPager.setCurrentItem(1, false); 

    /*The same as if you do not add the second parameter*/ 
    mPager.setCurrentItem(1, true); 

    /*Your ViewPager scrolls through all the needed views until it arrives at that view.*/ 
    mPager.setCurrentItem(1); 

Quello che posso raccomandare a voi con questo in mente è che si può provare ad aggiungere vista "fittizio" in posizioni 0 e "ultimo" e la vista in posizione 0 sarebbe lo stesso come la posizione "ultima - 1 "e la vista" ultima "sarebbe uguale alla posizione" 1 ". Quindi farai di tutto normale, TRANNE che su OnPageChangeListener controllerai se la pagina corrente è la posizione "0" o "last" e se lo è, chiamerai setCurrentItem ("1", false) o setCurrentItem ("ultimo - 1 ", falso) a seconda della posizione in cui ci si trova ora. In questo modo manterrai l'effetto "cambio pagina" mentre realizzi ciò che desideri.

Spero che questo possa aiutarti con il tuo problema.

NOTA: Si può avere un cambiamento lag dopo si arriva alla nuova posizione, perché si dovrà caricare la visualizzazione per le opinioni correnti, prossimo e l'ultimo (o se si è in 4.0+ allora sarà caricare solo la posizione attuale).

UPDATE:

Se si modifica il contenuto della lista/Array che determina il contenuto del ViewPager, è necessario chiamare:

ViewPager mPager = new ViewPager(); 
mPager.getAdapter().notifyDataSetChanged(); //This notify that you need to recreate the views 

/*This is if you want to change the data and then go to a specific position 
If you do not do this you will have a very Buggy Behavior*/ 
new Handler().post(new Runnable() { 
@Override 
public void run() { 
    mPager.setCurrentItem(2); //Where "2" is the position you want to go 
    } 
}); 

UPDATE 2:

Perché non aggiungi tutti i tuoi elementi allo ViewPager? lo ViewPager ha già un'ottimizzazione per gestire questi casi, nel mio caso ho molti elementi e funziona come un incantesimo.

Un'altra cosa, nel codice, vedo che si passa alla pagina centrale ogni volta che una pagina si "assesta". Ma in realtà non mostri mai la vista destra e sinistra, quindi perché li hai?

Ultima cosa, quando si modifica il set di dati è necessario chiamare il metodo "notifyDataSetChanged" che ho menzionato sopra, e quindi si chiama il metodo "setCurrentItem" all'interno di un gestore. In caso contrario, la tua app non funzionerà come previsto.

UPDATE 3:

Beh, l'unica cosa che posso consigliare è avere una lista in cui continuare ad aggiungere i nuovi oggetti che portano dal database, e poi come a quando si mantiene inserire oggetti al fine della lista non ci sono problemi. Se si desidera aggiungere oggetti nel mezzo o all'inizio, è necessario chiamare notifyDataSetChanged, ma ciò sarà piuttosto lento perché genererà nuovamente le visualizzazioni. Lo facciamo in questo modo e funziona perfettamente e persino scarichiamo le informazioni da un server, i dati non sono locali (e in realtà aggiungiamo informazioni alla fine e all'inizio della lista).

Se avete altre domande su come ottenere questo non esitate a chiedere.

AGGIORNAMENTO 4:

Solo nel caso in cui qualcuno è in realtà alla ricerca di una circolare ViewPager, ho aggiunto un proof of concept code che si può riutilizzare. Funziona senza problemi e l'ho usato con viste complesse e non c'è ancora alcun ritardo.

+0

Grazie @Jorge Aguilar. Ho usato la tua idea, ma ho cambiato alcune cose. Ho aggiunto la vista "fittizia" ma ho inserito diverse visualizzazioni. Ad esempio, se ho a, b, c, d, e. Ho messo la prima volta: a, a, a. E setCurrentItem (1, falso). Quando l'utente passa al successivo viewpager, è: a, b, c e setCurrentItem (1, false), ... In onPageScrollStateChanged ho inserito questo codice. Ma ora ho un piccolo problema. Se l'utente vuole scorrere velocemente, non può perché ci sono dei ritardi. Hai qualche idea? Grazie – MARM

+0

Puoi modificare la tua domanda o pubblicare una nuova domanda con maggiori dettagli sul nuovo numero per capirti meglio e aiutarti meglio. Ho già aggiornato la risposta per aggiungere alcune cose preziose. E se puoi segnare questo come risposta per chiunque entri, possono sapere che è stato risolto. –

+0

Ho modificato la mia domanda. – MARM

1

Non funziona senza un postDelayed, provare con questo codice:

viewPager.postDelayed(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     viewPager.setCurrentItem(num, true); 
    } 
}, 100); 
Problemi correlati