我有一个表示待办事项列表的SQLite表。每行都有_id
,title
和completed
标记。我有一个ListView
,其中每一行都有标题,并且复选框映射到completed
标志。我有一个自定义CursorAdapter
,用于设置bindView
中的复选框状态。该复选框具有OnClick
回调函数,可在切换时更新数据库状态。
问题是当项目在屏幕上滚动并返回时,复选框会丢失状态,因为视图是从过时的光标数据重建的。
我知道这里首选的解决方案是每次数据更改时转储和重新获取光标。这让我觉得痛苦无效。切换复选框时,我的结果集中的一位数据已经发生了变化。抛弃整个光标感觉就像是矫枉过正。
我尝试的另一种方法是缓存completed
标志,在项目切换时更新数据库和缓存,并检查bindView
中的缓存。这很有效,但感觉很糟糕。
我在这里遗漏了什么吗?有没有比上面更好的模式?每次发生微小变化时,我是否过高估计光标到期的成本?
答案 0 :(得分: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;
}
}
}