0

我有一个代表待办事项列表的 SQLite 表。每行都有一个_idtitle和一个completed标志。我有一个ListView,其中每一行都有标题和一个映射到completed标志的复选框。而且我有一个自定义CursorAdapter设置复选框状态bindView。复选框有一个OnClick回调,当它被切换时更新数据库状态。

问题是当一个项目被滚动并返回屏幕时复选框会丢失状态,因为视图是从过时的光标数据重建的。

我知道这里的首选解决方案是每次数据更改时转储并重新获取游标。这让我觉得非常低效。当一个复选框被切换时,实际上我的结果集中有一点数据发生了变化。扔掉整个光标感觉有点矫枉过正。

我尝试过的另一种方法是缓存completed标志,在切换项目时更新数据库和缓存,然后在bindView. 这行得通,但感觉很笨拙。

我在这里错过了什么吗?有没有比上面的更好的模式?我是否高估了每次发生微小变化时使光标过期的成本?

4

1 回答 1

0

我不会担心基于用户输入的光标刷新效率。这是一个恒定的成本,你不会注意到它。

另一种方法是覆盖 setViewValue 并手动设置这些复选框。您可以在下面找到有关如何做到这一点的想法。

public class MyViewBinder implements SimpleCursorAdapter.ViewBinder {

  public boolean setViewValue(View view, Cursor cursor, int columnIndex) {

    int viewId = view.getId();
    switch (viewId) {
        case R.id.flag:

            // Sett the flag based on e.g. an array you have with the states

            return true;
            break;

        default:
            // There is no specific way of showing this, hence go for default
            return = false;
    }
  }
}
于 2013-02-06T14:33:59.550 回答