如果LZ用的是CursorLoader(CursorLoader自带观察者,内部的cursor一旦发现数据库有变化会自动启动startloading,于是就会调用回调函数onLoaderFinished),那么在
OnLoaderFinished里面
adapter.swap(cursor);class MyAdapter extends XXX {
private Cursor mCursor;
...
void swap(Cursor cursor) {
mCursor = cursor; //变更数据
notifyDataSetChanged(); //如LS所言,这里是关键,告诉适配器MyAdapter数据有变化要更新view
}
...
}
OnLoaderFinished里面
adapter.swap(cursor);class MyAdapter extends XXX {
private Cursor mCursor;
...
void swap(Cursor cursor) {
mCursor = cursor; //变更数据
notifyDataSetChanged(); //如LS所言,这里是关键,告诉适配器MyAdapter数据有变化要更新view
}
...
}
swapCursor并不必须是官方的方法,可以是你私人的,你也可以取别的名字。关键是adapter公开出这个方法,让LoaderManager在回调函数OnLoaderFinished里面调用。而一旦一个CursurLoader的数据有变化,其内部经过一系列调用,最终也会触发OnLoaderFinished,并调用里面的swapCursor(也可以是其他的名字,反正能实现更新你adapter里面的数据,并同时通知你的adapter数据已改变,需要更新UI,即调用notifyDataSetChanged()就行了)
swapCursor并不必须是官方的方法,可以是你私人的,你也可以取别的名字。关键是adapter公开出这个方法,让LoaderManager在回调函数OnLoaderFinished里面调用。而一旦一个CursurLoader的数据有变化,其内部经过一系列调用,最终也会触发OnLoaderFinished,并调用里面的swapCursor(也可以是其他的名字,反正能实现更新你adapter里面的数据,并同时通知你的adapter数据已改变,需要更新UI,即调用notifyDataSetChanged()就行了)
谢谢回复。
现在是这个问题,我自己的adapter继承自CursorAdapter。覆盖了bindView函数,在此函数中我删除了数据库中的一条目。可onLoadFinished却没有被自动调用。只用当退出这个activity在从新进入时才会调用这个函数刷新。Loader和adapter需要什么关联吗?
增删数据后要加上 getContext().getContentResolver().notifyChange(uri, null);通知所有观察者数据改变。查询返回cursor前设置其观察的uri: cursor.setNotificationUri(getContext().getContentResolver(), uri);