Domanda

Al momento sto sviluppando un'app che utilizza ViewPager, il problema è che il modo in cui lo sto facendo rende estremamente lento l'avvio e occupa tonnellate di memoria.

Sto implementando il pageradapter in questo modo:

        public MyPagerAdapter(Context context) {
        views = new ArrayList<RelativeLayout>();
        views.add(new SliderLayout(context, "slide 8"));
        views.add(new SliderLayout(context, "slide 1"));
        views.add(new SliderLayout(context, "slide 2"));
        views.add(new SliderLayout(context, "slide 3"));
        views.add(new SliderLayout(context, "slide 4"));
        views.add(new SliderLayout(context, "slide 5"));
        views.add(new SliderLayout(context, "slide 6"));
        views.add(new SliderLayout(context, "slide 7"));
        views.add(new SliderLayout(context, "slide 8"));
        views.add(new SliderLayout(context, "Slide 1"));
    }

Tutti gli oggetti layout contengono un FrameLayout con un textView e un pannello che contiene una visualizzazione web con html locale. Tutti i layout hanno un contenuto unico, che viene caricato e gonfiato quando viene istanziata la classe SliderLayout.

Ho anche tentato di aggiungere viste al volo nel metodo instantiateItem, ma questo rende lo scorrimento più complicato e darà un'eccezione fatale OutOfMemory se scorro troppo velocemente.

Quindi la mia domanda è: qual è il modo migliore per implementare un ViewPager che contiene diverse viste uniche (ma basate sullo stesso layout), quindi non consuma così tanta memoria e si avvia più velocemente?

È stato utile?

Soluzione

Devi allegare le tue viste al pager in instantiateItem () (come fai nel normale metodo getView () dell'adattatore).In questo caso ViewPager si occupa della gestione della memoria.Dai un'occhiata al progetto demo in CompatibilityPackage.In realtà puoi avere migliaia di pagine senza ritardi.

@Override
public Object instantiateItem(View collection, int position) {
    View v = layoutInflater.inflate(...);
    ...
    ((ViewPager) collection).addView(v,0);
    return tv;
}

@Override
public void destroyItem(View collection, int position, Object view) {
    ((ViewPager) collection).removeView((TextView) view);
}

Altri suggerimenti

hm, la mia idea è di catturare l'evento "onPageChanged ()" nel ViewPager e impostare il webview dopo che la pagina è cambiata o, per precaricare come esempio una pagina in modo da avere l '"effetto scorrimento": fai quanto segue:

ad esempio, hai un conteggio di 10 pagine.se il tuo viewpager è a pagina 0, allora instanzi e carichi le pagine 0,1,2.se il tuo viewpager è nella schermata 4, rimuovi le visualizzazioni web nelle posizioni 0,1 e 7,8,9 ...

in questo modo non hai bisogno di tutte le istanze di visualizzazioni web (il webkit consuma molta memoria) e avere un po 'di memoria in più.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top