2013-01-29 9 views
14

Piszę aplikację na Androida, która czyta pojedynczy plik tekstowy i wyświetla go na TextView.Android - Jak skutecznie ładować dużą ilość tekstu w TextView?

Co robię teraz jest przeczytać cały plik do łańcucha (używając BufferedReader i StringBuilder) i wyświetlić go na TextView użyciu setText(string). Plik tekstowy o rozmiarze 700 KB może zająć około 2 do 3 sekund, zanim zostanie wyświetlony na ekranie.

Ale użyłem innych czytników e-booków dostępnych na rynku i mogą wyświetlać ten sam tekst niemal natychmiast. Czy ktoś wie, jak mogę to osiągnąć?

Dzięki.

Edytuj: Wiele sugeruje ListView, ale nie działa w moim przypadku. Wynika to z mojej odpowiedzi na jedną z odpowiedzi: ... [ListView] nie działa dla mnie z kilku powodów. (1) Aby widok Listview wyglądał jak TextView, musimy rozbić tekst na znak nowej linii. Jeśli załaduję pojedynczy duży akapit, jest on równie wolny jak ładowanie TextView. (2) Ponieważ ListView mierzy tylko element na ekranie, nie mogę z góry znać całkowitej "strony" lub "wysokości" całego tekstu.

Odpowiedz

6

Zasadniczo kluczem jest ładowanie potrzebnych danych tylko wtedy, gdy jest to potrzebne. Jednym ze sposobów na to byłoby umieszczenie każdego akapitu w jego własnym TextView, który jest umieszczony w ListAdapter, który jest włączony do ListView. Musi istnieć jakiś zestaw indeksu, tak aby każdy akapit wiedział, gdzie w pliku danych znaleźć. Ten interfejs pozwoli ci ładować tylko to, czego potrzebujesz, kiedy tego potrzebujesz. Twoja lista adapter wygląda mniej więcej tak (Ten kod nie jest kompletna, ale powinno dać wyobrażenie przynajmniej z tego, co należy zrobić):

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()); 
} 
} 

można zauważyć, że Amazon wykorzystuje system stronicowania dla aplikacja Kindle. Jeśli masz aplikację, na dole każdej strony możesz zobaczyć, w której sekcji się znajdujesz. Każda "strona" jest prawdopodobnie bliższa wymiaru zdania. To tylko kwestia uzyskania odpowiedniej strony, która może dość szybko zostać wykonana.

+0

W końcu mam trochę czasu, aby rozwiązać problem i to rozwiązanie nie działa dla mnie z kilku powodów. (1) Aby widok Listview wyglądał jak TextView, musimy rozbić tekst na znak nowej linii. Jeśli załaduję pojedynczy duży akapit, jest on równie wolny jak ładowanie TextView. (2) Ponieważ ListView mierzy tylko element na ekranie, nie mogę z góry znać całkowitej "strony" lub "wysokości" całego tekstu. –

2

Aby dodać co @PearsonArtPhoto powiedział -

proponuję wdrożyć jakiś mechanizm stronicowania, aby podzielić tekst na strony.
Co należy zrobić, to podzielić swój tekst zgodnie z powiedzmy N + M liczbą znaków na stronach.
N = stała liczba znaków.
M = liczba znaków od N do najbliższego znaku końca linii (aby ostatnia linia nie została "wycięta").
Sugeruję, że jeśli twoje urządzenie z Androidem pozwala trzymać to "w pamięci" -
zrób to,
i nie próbuj pobrać tego z pliku jedna strona po drugiej, ale raczej pobrać z "in" struktura pamięci - poprawi to wydajność.
Po przewinięciu i zorientowaniu się, że musisz pobrać następną stronę, pobierz ją ze struktury "w pamięci".

0

Musisz wziąć pod uwagę, czy używasz właściwych komponentów. Może lepiej jest czytać linie i umieszczać je w widoku listy.

spróbować

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

I wiele razy, że to, co widzisz() wygląd i samopoczucie nie podoba Ci się wydaje.

1

Lucas Rocha zbudował w tym celu fajną bibliotekę o nazwie Smoothie.

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

Pod koniec tych wskazówek eksploatacyjnych dla Android ListView tam link do wyjaśnienia na temat Smoothie i wreszcie znajdziesz bibliotekę dostępnych na github.

Pierwotnie opisany do ładowania obrazów, podejście stosuje się również do ładowania tekstu.

+0

Witamy w SO! Zastanów się nad poprawą jakości odpowiedzi i pomagając jej działać samodzielnie (to znaczy, jeśli link już nie działa), demonstrując, jak zastosować bibliotekę, dla której podano link do problemu. – J0e3gan