保持ListView CursorAdapter数据更新的推荐模式



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

问题是,当项目在屏幕上来回滚动时,复选框会失去状态,因为视图是根据过时的光标数据重建的。

我知道这里的首选解决方案是在每次数据更改时转储并重新获取光标。这让我觉得效率低下。当一个复选框被切换时,我的结果集中确实有一位数据发生了变化。扔掉整个光标感觉有些过头了。

我尝试过的另一种选择是缓存completed标志,在切换项目时更新数据库和缓存,并检查bindView中的缓存。这是有效的,但感觉很粗糙。

我是不是遗漏了什么?有比上面的模式更好的模式吗?我是否高估了每次发生微小更改时使光标过期的成本?

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

另一种方法是覆盖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;
    }
  }
}

最新更新