Android:ListView在数据库删除时错误更新
当我从sqlite表中删除一行时,ListView总是随着删除最后一个条目而更新。重新启动活动时,它会正确反映数据库内容 这是我从表中删除行的方式(mDb是SQLiteOpenHelper对象): 这就是列表更新(简化)的方式。我已验证是否调用了onLoadFinished()Android:ListView在数据库删除时错误更新,android,sqlite,android-loadermanager,android-cursorloader,Android,Sqlite,Android Loadermanager,Android Cursorloader,当我从sqlite表中删除一行时,ListView总是随着删除最后一个条目而更新。重新启动活动时,它会正确反映数据库内容 这是我从表中删除行的方式(mDb是SQLiteOpenHelper对象): 这就是列表更新(简化)的方式。我已验证是否调用了onLoadFinished() public class MyActivity extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> { …
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();
}
}
}
公共类MyActivity扩展ListActivity实现LoaderManager.LoaderCallbacks{
…
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.calllist);
String[]from=新字符串[]{…};
int[]to=新的int[]{…};
notes=new SimpleCursorAdapter(this,R.layout.item,null,from,to,0){
}
公共最终静态类MyCursorLoader扩展了SimpleCursorLoader{
final Loader.ForceLoadContentObserver=新的ForceLoadContentObserver();
@凌驾
公共游标loadInBackground(){
游标c=mDb.rawQuery(全选,空);
c、 registerContentObserver(this.observer);
c、 setNotificationUri(getContext().getContentResolver(),DB_URI);
返回c;
}
}
@凌驾
public void onLoadFinished(加载器,光标){
if(loader.getId()==loader\u ID){
注:变更光标(光标);
notes.notifyDataSetChanged();
}
}
}
当我延迟notifyChange(DB_URI,null)时,我似乎可以工作请拨打第二个或更多的电话。是否有必要?是否有其他方法解决此问题?尝试改用游标加载程序。请参见,这意味着我也必须实现一个ContentProvider,对吗?游标加载程序与ContentProviders一起工作……似乎他没有ContentProvider(他使用的是普通游标)…这就是为什么我认为这不是一个有效的答案
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();
}
}
}