我有一个非常简单CursorLoader
的加载一个Cursor
. 我将光标存储为我的活动中的一个字段。(所以不在一个CursorAdapter
!)
public static class BundlesLoader extends CursorLoader {
public static final String[] PROJECTION = new String[]{
BaseColumns._ID,
TITLE,
SUBTITLE,
DESCRIPTION
};
public BundlesLoader(Context ctx) {
super(
ctx,
URI_BUNDLES,
PROJECTION,
null,
null,
POSITION + " ASC"
);
}
}
当我打电话时ContentResolver.notifyChange(URI_BUNDLES, null)
,我希望 CursorLoader 重新加载,但事实并非如此。(见LoaderCallbacks
下文;我记录回调。)
为了调试这个问题,我注册了一点ContentObserver
,它确实有效,奇怪的是:
getContentResolver().registerContentObserver(LegislationProvider.URI_BUNDLES,
false, new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
Log.e("hello", "bundles changed!!!!!");
}
@Override
public void onChange(boolean selfChange, Uri uri) {
onChange(selfChange);
}
});
所以知道我不知道如何从这里调试。我的CursorLoader
初始化没问题,我的ContentObserver
作品,但由于某种原因,CursorLoader
当底层数据库发生变化时,它不会重新加载光标。有什么问题?
这是我的LoaderCallbacks
:
@Override
public android.support.v4.content.Loader onCreateLoader(int id, Bundle bundle) {
switch (id) {
case LoaderIds.LOADER_BUNDLES:
d("Creating new bundles loader");
return new Model.Bundle.Loader(getApplicationContext());
default:
throw new IllegalArgumentException(
"Could not handle loader id " + id);
}
}
@Override
public void onLoadFinished(android.support.v4.content.Loader loader, Cursor cursor) {
switch (loader.getId()) {
case LoaderIds.LOADER_BUNDLES:
d("onLoadFinished: Bundles loaded with "
+ cursor.getCount() + " elements");
mMasterFragment.setBundlesCursor(cursor);
break;
default:
throw new IllegalArgumentException(
"Could not handle loader id " + loader.getId());
}
}
@Override
public void onLoaderReset(android.support.v4.content.Loader loader) {
switch (loader.getId()) {
case LoaderIds.LOADER_BUNDLES:
d("onLoaderReset: Clearing collection adapter");
mMasterFragment.setBundlesCursor(null);
break;
default:
throw new IllegalArgumentException(
"Could not handle loader id " + loader.getId());
}
}