当我从 sqlite 表中删除一行时,ListView 总是随着删除最后一个条目而更新。重新启动活动时,它会正确反映数据库内容。
这就是我从表中删除一行的方式(mDb 是一个 SQLiteOpenHelper 对象):
mDb.delete(TABLE, COL_ID + "=" + id, null);
mContext.getContentResolver().notifyChange(DB_URI, null);
这就是列表的更新方式(简化)。我已经验证 onLoadFinished() 被调用。
public class MyActivity extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> {
…
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.calllist);
String[] from = new String[] { … };
int[] to = new int[] { ... };
notes = new SimpleCursorAdapter(this, R.layout.item, null, from, to, 0){
}
public final static class MyCursorLoader extends SimpleCursorLoader {
final Loader.ForceLoadContentObserver observer = new ForceLoadContentObserver();
@Override
public Cursor loadInBackground() {
Cursor c = mDb.rawQuery(SELECT_ALL, null);
c.registerContentObserver(this.observer);
c.setNotificationUri(getContext().getContentResolver(), DB_URI);
return c;
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (loader.getId() == LOADER_ID) {
notes.changeCursor(cursor);
notes.notifyDataSetChanged();
}
}
}
当我将 notifyChange(DB_URI, null) 调用延迟一秒或更长时间时,我似乎在工作。这应该是必要的吗?有没有其他方法可以解决这个问题?