14

我正在编写一个读取单个文本文件并将其显示在TextView.

我现在正在做的是将整个文件读入 String (使用BufferedReaderand StringBuilder)并将其显示在TextViewusing上setText(string)。一个 700KB 的文本文件大约需要 2 到 3 秒才能显示在屏幕上。

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

谢谢。

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

4

5 回答 5

6

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

于 2013-01-29T16:44:08.493 回答
2

补充@PearsonArtPhoto 所说的话-

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

于 2013-01-29T16:47:47.667 回答
1

您可以将 Jetpack 中的 Android 分页库与自定义 View 或 RecyclerView 一起使用

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

  1. 实现提供数据范围列表的 DataSource 抽象
  2. 实现提供真实数据的存储抽象(来自数据库、网络、文件等)
  3. 使用 RecyclerView 和 Adapter 展示数据

可以在这里找到显示大文件内容的示例应用程序 https://github.com/YablokovDmitry/FileView

于 2019-07-22T10:08:22.150 回答
1

为此,Lucas Rocha 构建了一个名为 Smoothie 的不错的库。

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

在 Android listview 的性能提示的末尾,有一个关于 Smoothie 的解释链接,最后你会在 github 上找到可用的库。

最初描述用于加载图像,该方法也适用于加载文本。

于 2015-11-03T19:13:30.790 回答
0

您必须考虑是否使用了正确的组件。也许阅读行并将它们放入列表视图会更好。

尝试

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

很多时候,你所看到的(外观和感觉)并不像你想象的那样。

于 2013-01-29T18:01:52.093 回答