Android - 如何在 TextView 中有效地加载大量文本?

2022-09-04 03:45:23

我正在编写一个Android应用程序,该应用程序读取单个文本文件并将其显示在.TextView

我现在正在做的是将整个文件读入字符串(using and ),并将其显示在 using .一个 700KB 的文本文件可能需要大约 2 到 3 秒才能显示在屏幕上。BufferedReaderStringBuilderTextViewsetText(string)

但是我在市场上使用过其他一些电子书阅读器,它们几乎可以立即显示相同的文本。有人知道我怎样才能做到这一点吗?

谢谢你。

编辑:许多人建议使用ListView,但它不适用于我的特定情况。这是来自我对其中一个答案的回复:...[ListView]由于一些原因对我不起作用。(1)为了使Listview看起来像一个TextView,我们必须在新行字符上分解文本。如果我加载单个大段落,它与加载TextView一样慢。(2)由于ListView仅测量屏幕上的项目,因此我无法提前知道整个文本的总“页数”或“高度”。


答案 1

从本质上讲,关键是仅在需要时加载所需的数据。一种方法是将每个段落放入它自己的TextView中,TextView被放入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应用程序使用了分页系统。如果你有这个应用,你可以在每个页面的底部看到你所在的部分。每个“页面”的长度可能更接近一个句子左右。然后,只需获得正确的页面即可,这可以相当快地完成。


答案 2

补充@PearsonArtPhoto所说的话——

我建议你实现某种分页机制,将文本分成几页。
你应该做的是根据每页N + M个字符数来拆分文本。
N = 固定字符数。
M = 从 N 到最近的行尾字符的字符数(因此您不会看到最后一行被“剪切”)。
我建议,如果您的Android设备允许您将此“内存”保存 -
这样做,
并且不要尝试从文件一页接一页地获取它,而是从“内存中”结构中获取 - 这将提高性能。
一旦你滚动并意识到你需要获取下一页,从“内存中”结构中获取它。


推荐