Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:ListView在数据库删除时错误更新_Android_Sqlite_Android Loadermanager_Android Cursorloader - Fatal编程技术网

Android:ListView在数据库删除时错误更新

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> { …

当我从sqlite表中删除一行时,ListView总是随着删除最后一个条目而更新。重新启动活动时,它会正确反映数据库内容

这是我从表中删除行的方式(mDb是SQLiteOpenHelper对象):

这就是列表更新(简化)的方式。我已验证是否调用了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();
        }
    }
}
公共类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();
        }
    }
}