簡體   English   中英

Android - 如何在TextView中高效加載大量文本?

[英]Android - How do you efficiently load a large amount of text in a TextView?

我正在編寫一個Android應用程序,它可以讀取單個文本文件並將其顯示在TextView

我現在正在做的是將整個文件讀入一個String(使用BufferedReaderStringBuilder )並使用setText(string)TextView上顯示它。 一個700KB的文本文件可能需要大約2到3秒才能在屏幕上顯示。

但我在市場上使用了其他一些電子書閱讀器,他們幾乎可以立即顯示相同的文字。 誰知道我怎么能做到這一點?

謝謝。

編輯 :許多建議ListView,但它不適用於我的特定情況。 這是我對其中一個答案的回復:... [ListView]由於某些原因對我不起作用。 (1)為了使Listview看起來像TextView,我們必須在新行字符上打破文本。 如果我加載一個大段落,它就像加載TextView一樣慢。 (2)由於ListView僅測量屏幕上的項目,因此我無法提前知道整個文本的總“頁面”或“高度”。

從本質上講,關鍵是只在您需要時加載您需要的數據。 一種方法是將每個段落放入它自己的TextView中,將其放入ListAdapter中,ListAdapter包含在ListView中。 必須有某種索引集,這樣每個段落都知道要在數據文件中找到的位置。 此界面允許您在需要時僅加載所需內容。 你的列表適配器看起來像這樣(這段代碼不完整,但它應該讓你至少知道你應該做什么):

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

可以注意到,亞馬遜使用Kindle應用程序的尋呼系統。 如果您有應用程序,則可以在每個頁面的底部看到您所在的部分。 每個“頁面”可能更接近句子的長度。 然后,只需要獲得正確的頁面,這可以很快完成。

添加@PearsonArtPhoto所說的內容 -

我建議你實現某種分頁機制,將你的文本分成頁面。
你應該做的是按照每頁N + M個字符數來分割你的文字。
N =固定的字符數。
M =從N到最接近的行尾字符的字符數(因此您不會看到最后一行被“剪切”)。
我建議如果你的Android設備允許你把它“保存在內存中” -
去做,
並且不要嘗試從一個頁面接一個地從文件中獲取它,而是從“內存”結構中獲取 - 這將提高性能。
滾動並意識到需要獲取下一頁后,從“內存”結構中獲取它。

Lucas Rocha為此建立了一個名為Smoothie的漂亮圖書館。

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

在Android listview的那些性能提示的最后,有一個關於Smoothie的解釋的鏈接,最后你會在github上找到該庫。

最初描述用於加載圖像,該方法也適用於加載文本。

您必須考慮是否使用正確的組件。 也許讀取行並將它們放到listview中會更好。

嘗試

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

很多時候你所看到的(外觀和感覺)並不像你想的那樣。

您可以使用Jetpack的Android Paging Library和自定義View或RecyclerView

https://developer.android.com/topic/libraries/architecture/paging

  1. 實現提供數據范圍列表的DataSource抽象
  2. 實現存儲抽象,提供真實數據(來自數據庫,網絡,文件等)
  3. 使用RecyclerView和Adapter顯示數據

可以在此處找到顯示大文件內容的示例應用程序https://github.com/YablokovDmitry/FileView

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM