我有一个表示待办事项列表的SQLite表。每一行都有一个_id
、title
和completed
标志。我有一个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;
}
}
}