【问题标题】:Android: Reading a large CSV file efficiently?Android:高效读取大型 CSV 文件?
【发布时间】:2014-04-06 15:48:43
【问题描述】:

我有一个大型 CSV 文件(大约 12000 行),我需要对其进行解析并在 ListView 中显示。

我不想将整个文件加载到内存中,我想按 10 行组读取它,当用户单击“加载更多”按钮时,会读取接下来的 10 行,依此类推。

关于如何以有效的方式实现这一目标的任何建议?

谢谢

【问题讨论】:

  • “我想分 10 行组阅读它,当用户单击“加载更多”按钮时,会读取接下来的 10 行,依此类推”——你为什么认为这是用户会想要吗?
  • 我会做什么:1 -(在第一次应用程序启动时 - 您可以将此信息保留在首选项键中)将 CSV 存储在数据库中,逐行读取线并插入它。 2 - 在 10 条记录的“页面”中检索数据并为 ListView 填充适配器
  • @CommonsWare 因为这已经是客户的要求了 :)
  • 所以您的客户希望用户必须按“加载更多”1200 次?你的客户真的有一个正常运转的大脑吗?
  • 这将是使用 SQLite 数据库的更多理由,因为您无法有效地搜索 CSV 文件。

标签: android


【解决方案1】:

嗯,这是可能的起点:

第 1 步:创建一个 ArrayAdapter,其数据模型是您的读入行数组

第 2 步:覆盖 getCount() 以返回数组大小加 1,以容纳额外的“加载更多”行

第 3 步:覆盖 getViewTypeCount() 以返回 2(或更多,如果您的 CSV 行的 ListView 行不完全相同 - 我将假设它们对于此答案的其余部分都相同,所以这两种类型是“常规行”和“'加载更多'行”)

第 4 步:覆盖 getItemViewType() 以在位置等于您的数组大小时返回 1,或在低于该位置的所有位置返回 0

第 5 步:覆盖 getView() 以返回适当的行,包括返回您的“加载更多”行

第 6 步:当用户单击“加载更多”行时,运行您的逻辑以读取下一个 CSV 行,将它们添加到您的数组中,然后在适配器上调用 notifyDataSetChanged() 以提醒 ListView数据发生了变化

【讨论】:

  • 非常感谢,现在我怎样才能跟踪文件中读取的行,所以下次我读取接下来的 10 行时,我不必遍历前面的行?
  • @MinaSamy:这在很大程度上取决于您在 CSV 文件中的阅读方式。因为我认为我十年来没有读过 Java 中的 CSV 文件,所以我无法真正帮助你。请注意,根据对您的问题的评论,Android 对 CSV 没有特别的支持,就像它对 JSON 和 XML 所做的那样。因此,您在 CSV 文件中读取的内容可能是通用 Java,没有特别针对 Android 的。
猜你喜欢
  • 2020-06-29
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 2017-04-19
  • 1970-01-01
  • 2012-08-30
相关资源
最近更新 更多