【问题标题】:Populate the ListView of a CursorAdapter with running totals使用运行总计填充 CursorAdapter 的 ListView
【发布时间】:2015-04-09 23:11:54
【问题描述】:

我有一个 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 或列表视图来这样做。这可能吗?

【问题讨论】:

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


    【解决方案1】:

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

    • 创建ResourceCursorAdapter 的子类。这将处理为您的列表项创建视图。
    • 给它一个私人的SparseArray 来持有余额。
    • 覆盖swapCursor() 以遍历游标并为每条记录生成余额。由于每条记录都有一个ID,所以将余额放在SparseArray中,ID为key。然后拨打super.swapCursor()
    • 覆盖bindView() 以从光标当前位置获取日期和金额并将它们放在视图中。然后,使用游标中的记录 ID,从SparseArray 中获取余额并将其放入视图中。

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

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

    【讨论】:

    • 谢谢你的想法,一旦我有机会实现一切,我会告诉你它是如何工作的。如果我将余额保留在数据库的事务表中,您认为最好的方法是什么?我应该使用ContentValues 插入它还是应该创建一个自动设置该字段的触发器?如果我确实将它存储在数据库中,我也会担心如果用户删除事务会出现不一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    相关资源
    最近更新 更多