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.
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
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. –
Ho modificato la mia domanda. – MARM