【发布时间】:2015-09-23 13:56:45
【问题描述】:
我有一个活动 ActivityA,它包含一个由 CursorLoader 填充的列表视图。我想切换到 ActivityB 并更改一些数据,然后查看这些更改反映在 ActivityA 的列表视图中。
public class ActivityA implements LoaderManager.LoaderCallbacks<Cursor>
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
getSupportLoaderManager().initLoader(LOADER_ID, null, this);
mCursorAdapter = new MyCursorAdapter(
this,
R.layout.my_list_item,
null,
0 );
}
.
.
.
/** Implementation of LoaderManager.LoaderCallbacks<Cursor> methods */
@Override
public Loader<Cursor> onCreateLoader(int loaderId, Bundle arg1) {
CursorLoader result;
switch ( loaderId ) {
case LOADER_ID:
/* Rename v _id is required for adapter to work */
/* Use of builtin ROWID http://www.sqlite.org/autoinc.html */
String[] projection = {
DBHelper.COLUMN_ID + " AS _id", //http://www.sqlite.org/autoinc.html
DBHelper.COLUMN_NAME // columns in select
}
result = new CursorLoader( ActivityA.this,
MyContentProvider.CONTENT_URI,
projection,
null,
new String[] {},
DBHelper.COLUMN_NAME + " ASC");
break;
default: throw new IllegalArgumentException("Loader id has an unexpectd value.");
}
return result;
}
/** Implementation of LoaderManager.LoaderCallbacks<Cursor> methods */
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
switch (loader.getId()) {
case LOADER_ID:
mCursorAdapter.swapCursor(cursor);
break;
default: throw new IllegalArgumentException("Loader has an unexpected id.");
}
}
.
.
.
}
我从 ActivityA 切换到 ActivityB,在此更改基础数据。
// insert record into table TABLE_NAME
ContentValues values = new ContentValues();
values.put(DBHelper.COLUMN_NAME, someValue);
context.getContentResolver().insert( MyContentProvider.CONTENT_URI, values);
MyContentProvider 的详细信息:
public class MyContentProvider extends ContentProvider {
.
.
.
@Override
public Uri insert(Uri uri, ContentValues values) {
int uriCode = sURIMatcher.match(uri);
SQLiteDatabase database = DBHelper.getInstance().getWritableDatabase();
long id = 0;
switch (uriType) {
case URI_CODE:
id = database.insertWithOnConflict(DBHelper.TABLE_FAVORITE, null, values,SQLiteDatabase.CONFLICT_REPLACE);
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null); // I call the notifyChange with correct uri
return ContentUris.withAppendedId(uri, id);
}
@Override
public Cursor query(Uri uri,
String[] projection,
String selection,
String[] selectionArgs,
String sortOrder) {
// Using SQLiteQueryBuilder instead of query() method
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
int uriCode = sURIMatcher.match(uri);
switch (uriCode) {
case URI_CODE:
// Set the table
queryBuilder.setTables(DBHelper.TABLE_NAME);
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
SQLiteDatabase database = DBHelper.getInstance().getWritableDatabase();
Cursor cursor = queryBuilder.query( database, projection, selection, selectionArgs, null, null, sortOrder);
// Make sure that potential listeners are getting notified
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
}
据我所知,这应该足够了。但它不起作用。 返回到 ActivityA 后,列表视图保持不变。
我已经用调试器跟踪了事情,这就是发生的事情。
首先访问ActivityA,依次调用的方法
MyContentProvider.query()
ActivityA.onLoadFinished()
列表视图显示正确的值。 现在我切换到activityB并更改数据
MyContentProvider.insert() // this one calls getContext().getContentResolver().notifyChange(uri, null);
MyContentProvider.query()
//As we can see the MyContentProvider.query is executed. I guess in response to notifyChange().
// What I found puzzling why now, when ActivityB is still active ?
返回ActivityA
!!! ActivityA.onLoadFinished() is not called
我已经阅读了有关此的所有内容,仔细查看了许多 stackoverflow 问题,但所有这些问题/答案都围绕我实现的 setNotificationUri() 和 notifyChangeCombo() 展开。为什么这不能跨活动工作?
如果例如在 ActivityA.onResume() 中使用
强制刷新getContentResolver().notifyChange(MyContentProvider.CONTENT_URI, null, false);
然后刷新列表视图。但这会强制刷新每个简历,无论数据是否更改。
【问题讨论】:
-
您可以将 onActivityResult 用于您的实例。
-
onActivityResult 是您在活动中使用的方法。如果你想打开一个活动并改变一些东西,然后回到上一个打开的活动来应用这些东西,那么你应该使用 onActivityResult。请在谷歌上搜索。希望对您有所帮助。
-
@HusseinElFeky 不,它没有,虽然我很欣赏你的热情。
-
当然应该有帮助。首先,您使用 startActivityForResult 启动新活动。如果您完成新活动,则添加 ok 返回码。然后在 OnActivityResult 你可以调用 getContentResolver().notifyChange(MyContentProvider.CONTENT_URI, null, false);。 |请解释一下你做了什么,到底什么没用。
-
@f470071 请查看此链接以获取简单示例:developer.android.com/training/basics/intents/result.html
标签: android android-contentprovider