Autore Topic: ViewPager: inserimento di pagine in testa alla lista evitando lags  (Letto 804 volte)

Offline uandev

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus Dual - Nexus 7
  • Sistema operativo:
    Ubuntu 12.10
0
Prima di tutto un saluto a tutto il forum!  :-)
Ho un piccolo dilemma da porvi. Praticamente ho creato un ViewPager il quale conterrà inizialmente tre pagine rispettivamente nelle posizioni 0, 1 e 2, ed in seguito altre pagine aggiunte dinamicamente alla fine o all'inizio.
Scrollando orizzontalmente sulle pagine faccio in modo che se viene visualizzata la pagina in ultima posizione automaticamente ne viene aggiunta un'altra alla fine, allo stesso modo se viene visualizzata la pagina in posizione 0 viene aggiunta un'altra pagina in testa alla lista. Diciamo che il tutto funziona ma ho dei rallentamenti quando si va ad inserire ed immediatamente a visualizzare la pagina in testa, se non sbaglio il ritardo è dovuto all'aggiornamento di tutti gli indici delle pagine (tramite notifyDataSetChanged() ). Ora vi chiedo se avete qualche consiglio da darmi per evitare questi lags.  ;-)

Questo è il mio PagerAdapter:
Codice (Java): [Seleziona]
private class MyPagerAdapter extends PagerAdapter {
               
                ArrayList<TableLayout> mTableLayoutList = new ArrayList<TableLayout>();
               
                public void addTableLayout(TableLayout table, boolean start){
                        if(start) {
                                // Aggiunge la vista in testa alla lista
                                mTableLayoutList.add(0, table);
                        }
                        else {
                                mTableLayoutList.add(table);
                        }
                }
               
                @Override
                public Object instantiateItem(ViewGroup container, int position) {
                        TableLayout tl = mTableLayoutList.get(position);
                        ((ViewPager)container).addView(tl);
                        return tl;
                }

                @Override
                public int getCount() {
                        return mTableLayoutList.size();
                }

                @Override
                public int getItemPosition(Object object) {
                        return mTableLayoutList.indexOf(object);
                }

                @Override
                public boolean isViewFromObject(View arg0, Object arg1) {
                        return arg0 == ((View) arg1);
                }
               
                @Override
                public void destroyItem(ViewGroup container, int position, Object object) {
                        container.removeView((View)object);
                }
        }

E questo è il listener che controlla se sono sulla prima pagina o sull'ultima:
Codice (Java): [Seleziona]
mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
                       
                        @Override
                        public void onPageSelected(int position) {
                               
                                 if(position == 0) {
                                        mPagerAdapter.addTableLayout(mTableLayout, true);
                                        // Possibile lag qui
                                        mPagerAdapter.notifyDataSetChanged();
                               
                                 }else if(position == mPagerAdapter.getCount()-1) {
                                        mPagerAdapter.addTableLayout(mTableLayout, false);
                                }
                        }
    ...

Grazie in anticipo e spero che possiate aiutarmi!  :-P

EDIT: scusatemi ho sbagliato sezione il post va in quella sotto! (View e Layout) :-P

 
« Ultima modifica: 12 Dicembre 2012, 15:18:39 CET da uandev »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ViewPager: inserimento di pagine in testa alla lista evitando lags
« Risposta #1 il: 12 Dicembre 2012, 09:18:46 CET »
0
Hai provato a giocare con il valore di ViewPager.html.setOffscreenPageLimit() ?

Offline uandev

  • Nuovo arrivato
  • *
  • Post: 9
  • Respect: 0
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    LG Optimus Dual - Nexus 7
  • Sistema operativo:
    Ubuntu 12.10
Re:ViewPager: inserimento di pagine in testa alla lista evitando lags
« Risposta #2 il: 12 Dicembre 2012, 15:15:09 CET »
0
Ciao Ricky e grazie per la risposta.

Ho seguito il tuo consiglio ma nulla è cambiato, inoltre da quello che sono riuscito a capire il metodo setOffScreenPageLimit() serve solo per impostare nel ViewPager il numero di pagine non visualizzate da non distruggere automaticamente. Questo metodo nel mio caso non serve a risolvere il problema in quanto se inserisco una pagina in testa comunque devono essere aggiornati tutti gli indici delle altre. Faccio un esempio:

Poniamo che inizialmente ho una situazione del genere

Viste    Vista 1    Vista 2    Vista 3    Vista 4

Indici        0            1              2             3


Se inserisco una vista in testa avrò

Viste    Vista 0    Vista 1    Vista 2    Vista 3    Vista 4

Indici        0            1              2              3             4

gli indici delle viste in rosso devono essere aggiornati indipendentemente dal valore settato tramite il metodo setOffScreenPageLimit().

Credo che una possibile soluzione sia far in modo che inserendo una vista in posizione 0 non vengano aggiornati tutti gli indici ma soltanto quelli relativi alle pagine che verranno selezionate. Diciamo una sorta di aggiornamento dinamico. Il problema è che ancora non mi viene in mente come implementarlo!  :-P

Fammi sapere se ti viene qualche altra idea! 
« Ultima modifica: 12 Dicembre 2012, 15:16:54 CET da uandev »