2013-01-29 20 views
14

Sto scrivendo un'app per Android che legge un singolo file di testo e lo visualizza su un TextView.Android: come si carica in modo efficiente una grande quantità di testo in un TextView?

Quello che sto facendo in questo momento sta leggere l'intero file in una stringa (usando BufferedReader e StringBuilder) e visualizzarlo su un TextView utilizzando setText(string). Un file di testo da 700 KB può richiedere da 2 a 3 secondi prima che venga visualizzato sullo schermo.

Ma ho usato altri lettori di ebook sul mercato e possono visualizzare lo stesso testo quasi all'istante. Qualcuno sa come posso ottenere questo?

Grazie.

Modifica: molti suggeriscono ListView, ma non funziona per il mio caso particolare. Questo è dalla mia risposta a una delle risposte: ... [ListView] non funziona per me per alcuni motivi. (1) Per rendere la Listview simile a una TextView, dobbiamo rompere il testo sul carattere della nuova riga. Se carico un singolo grande paragrafo, è lento come caricare un TextView. (2) Dal momento che ListView misura solo l'elemento sullo schermo, non posso sapere in anticipo le "pagine" o "altezza" totali dell'intero testo.

risposta

6

In sostanza, la chiave è caricare solo i dati di cui hai bisogno, quando ne hai bisogno. Un modo per farlo sarebbe quello di inserire ogni paragrafo nel proprio TextView, che viene inserito in un ListAdapter, che è incluso in un ListView. Ci deve essere una specie di un indice impostato, in modo tale che ogni paragrafo sappia dove trovare il file di dati. Questa interfaccia ti consentirà di caricare solo ciò di cui hai bisogno, quando ne hai bisogno. La scheda lista simile a questa (Questo codice non è completa, ma dovrebbe dare un'idea, almeno di quello che si dovrebbe fare):

class ParagraphAdapter extends ListAdapter{ 
ArrayList<Integer> mLocations; // Somewhere define this to your locations, I'll leave that for you to figure out 
protected View getView(int position,View convertView, ViewGroup parent) 
{ 
    mLocations.get(position); // Read the file starting at this position, until the next value 
    String text; // This is the output of the above 
    TextView tv=new TextView(context); 
    tv.setText(parent.getContext()); 
} 
} 

Si può notare che Amazon utilizza un sistema di paging per l'App Kindle. Se hai l'app, puoi vedere in fondo a ciascuna pagina in quale sezione ti trovi. Ogni "pagina" è probabilmente più vicina a una frase di lunghezza. Quindi è solo questione di ottenere la pagina giusta, che può essere fatta abbastanza rapidamente.

+0

Ho finalmente avuto un po 'di tempo per affrontare il problema e questa soluzione non funziona per me per alcuni motivi. (1) Per rendere la Listview simile a una TextView, dobbiamo rompere il testo sul carattere della nuova riga. Se carico un singolo grande paragrafo, è lento come caricare un TextView. (2) Dal momento che ListView misura solo l'elemento sullo schermo, non posso sapere in anticipo le "pagine" o "altezza" totali dell'intero testo. –

2

Per aggiungere su quello che @PearsonArtPhoto ha detto -

ti suggerisco di attuare una sorta di meccanismo di paginazione, di dividere il testo in pagine.
Quello che dovresti fare è dividere il testo secondo diciamo N + M numero di caratteri per pagina.
N = numero di caratteri fisso.
M = numero di caratteri da N al carattere di fine riga più vicino (quindi non vedrete l'ultima linea "tagliata").
Vorrei suggerire che se il tuo dispositivo Android ti permette di tenere questo "in memoria" -
fai questo,
e non provare a recuperarlo dal file una pagina dopo l'altra, ma piuttosto riprendi da "in" memoria "struttura - questo migliorerà le prestazioni.
Una volta che si scorre e si rende conto che è necessario recuperare la pagina successiva, recuperarla dalla struttura "in memoria".

0

È necessario considerare se si utilizzano componenti corretti. Forse è meglio interpretare le linee e metterle in listview.

provare

List<String> lines; 
listview.adapter(new ArrayAdapter<String>(...,lines)); 

E molte volte che ciò che si vede (aspetto grafico) non è come siete pensare.

1

Lucas Rocha ha costruito una bella biblioteca chiamata Smoothie per quello scopo.

http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/

Alla fine di quelle punte di prestazione per Android ListView c'è un link ad una spiegazione su Smoothie e, infine, troverete la libreria disponibile su GitHub.

Originariamente descritto per il caricamento delle immagini, l'approccio si applica anche al caricamento del testo.

+0

Benvenuti in SO! Considera di migliorare la qualità della risposta e di aiutarla a stare in piedi da sola (ovvero se il link non funziona più) dimostrando come applicare la libreria per la quale hai fornito un link al problema in questione. – J0e3gan