2010-11-03 8 views
5

Ho un app Android che ha sia CursorAdapter basate ListView s (sostenuta da SQLite), così come personalizzato BaseAdapter basato ListView s che sono costruiti al volo da JSON abbattuto da un server.scorrimento grandi liste di adattatori Cursor-based è più veloce di molto più piccole liste di adattatori in memoria

I dati visualizzati in entrambi sono identici: un'immagine e un paio di TextView s. Il mio ListView basato su cursore ha 3000 righe, il ListView basato su JSON ne ha circa 30. Tuttavia, scorrere l'elenco verso il basso è notevolmente più veloce per la scheda basata su cursore. Per gli elenchi basati su JSON, i dati vengono tutti recuperati prima che le righe siano rese visibili. Le immagini per entrambi i tipi di elenchi vengono scaricate su richiesta.

ho entrambe le ListViews configurati in modo identico - entrambi con fastScrollEnabled, scrollingCache e smoothScrollbar impostato su true.

Sono in cerca di indicazioni su come andare a cercare di capire cosa sta succedendo qui e potenzialmente risolvere il problema in modo che gli ListView basati su JSON siano veloci quanto quelli basati su Cursore.

risposta

3

Ho una cosa simile nella mia applicazione, eccetto che ho solo ListView supportato da json e ho anche circa 30 elementi in esso (con i dati che cambiano costantemente e l'animazione che gioca per riflettere i cambiamenti). Sarebbe molto più facile rilevare un problema con un codice fornito dalla tua parte, ma qui ci sono un paio di trucchi che puoi citare in giudizio per l'ottimizzazione.

  1. Riutilizzare convertView che viene passato a voi come uno dei parametri nel metodo getView, velocizza davvero lo scorrimento.
  2. O creare la propria vista di riga (estendendo alcuni layout o ViewGroup) oppure utilizzare setTag su una riga si restituisce il metodo getView. In questo tag, dovresti conservare un oggetto che contiene riferimenti alle viste in quella riga, quindi non dovrai cercarli con findViewById ogni volta che viene richiesta una riga. oggetto può essere una classe statica semplice come

    private static class ViewHolder {

    ImageView image; 
        TextView text; 
    

    }

Sulla prima volta (quando il convertView è nullo ed è necessario creare una riga fresca) basta creare un'istanza del ViewHolder e impostare quelli parametri per fare riferimento ai parametri della riga appena creata (chiamando findViewById) e inserisci questa istanza nel metodo setTag della riga. La prossima volta che riutilizzi convertView, chiama semplicemente getTag e nel tag ricevuto riceverai i riferimenti alle viste in quella riga, quindi non dovrai più chiamare findViewById.

Ovviamente, potresti già aver fatto tutte quelle cose.

P.S. Ti consiglio (se non l'hai già fatto) di guardare la presentazione I/O di Google su ListView. Un sacco di informazioni utili lì: http://www.youtube.com/watch?v=wDBM6wVEO70

+0

Grazie per il link al video - mi ha aiutato a sistemare un po 'di piccole cose prive di documenti. – psychotik

Problemi correlati