使用运行总计填充CursorAdapter的ListView

时间:2015-04-09 23:11:55

标签: android android-listview android-sqlite android-cursoradapter

我有一个ListView,它显示了一个银行账户的交易列表,最近的一个是底部最旧的。我希望每个Listview项目在该特定交易之后显示帐户余额的快照,一直到显示帐户起始余额的页脚视图。例如,假设我开了一个300美元的账户,我提取两个50美元的提款和10美元的存款。我想看到这样的事情:

| transDate | transAmount | accountBalance |
+-----------+-------------+----------------+
| 04/09/15  |    +$10     |     $210       |
| 04/05/15  |    -$50     |     $200       |
| 04/03/15  |    -$50     |     $250       |
| 04/01/15  |    start    |     $300       |

目前,我的交易表只保存交易日期,金额,以及是否是提款或存款,因此我可以显示上面的前两列。

我可能是错的,但我认为在数据库中保存帐户余额快照是安全的,因为该字段可以被操纵,我想尽我所能确保所有计数反映了当前的平衡。

出于同样的原因,我想在列表视图填充时将第三列作为计算值,但我不知道如何调整CursorAdapter或listview来执行此操作。这可能吗?

1 个答案:

答案 0 :(得分:1)

恕我直言,我认为保持数据库中的余额并不是一个坏主意。但是,如果你把这个任务交给我,我就会这样做:

  • 创建ResourceCursorAdapter的子类。这将处理为列表项创建视图。
  • 为其提供私人SparseArray以保留余额。
  • 覆盖swapCursor()以遍历游标并为每条记录生成余额。由于每条记录都有一个ID,因此将余额放在SparseArray中,并将ID作为密钥。然后致电super.swapCursor()
  • 覆盖bindView()以获取光标在其当前位置的日期和金额,并将它们放在视图中。然后,使用光标中的记录ID,从SparseArray获取余额并将其放在视图中。

这是一种蛮力的方法,不是很优雅。并且性能肯定会降低更多的交易。

我认为要真正完成这项工作,您需要一些对帐检查点,这样您就不会在开始时使用零余额,而是从最后一次对帐余额开始。否则,当您将光标设置在适配器上时,该适配器又调用swapCursor()方法,在ListView显示之前生成所有余额需要永远。