我正在创建一个类似于这样的MergeCursor:
@Override
public Cursor loadInBackground() {
Log.d(LOG, "loading data in background");
ContentResolver cr = getContext().getContentResolver();
Cursor people = getContext().getContentResolver().query(PeopleProvider.CONTENT_URI, null, null, null, null);
people.setNotificationUri(cr, PeopleProvider.CONTENT_URI);
Cursor jobs = getContext().getContentResolver().query(JobProvider.CONTENT_URI, null, null, null, null);
jobs.setNotificationUri(cr, JobsProvider.CONTENT_URI);
Cursor horses = getContext().getContentResolver().query(HorseProvider.CONTENT_URI, null, null, null, null);
horses.setNotificationUri(cr, HorseProvider.CONTENT_URI);
Cursor[] c = new Cursor[3];
c[0] = people;
c[1] = jobs;
c[2] = horses;
MergeCursor mc = new MergeCursor(c);
return mc;
}然后,当我向相应的db表添加新行时:
"PeopleProvider.java"
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.d(LOG, "Insert into People");
long id = database.insertOrThrow(DatabaseConstants.TABLE_PEOPLE, null, values);
getContext().getContentResolver().notifyChange(uri, null);
return ContentUris.withAppendedId(uri, id);
}我也试过:
"WhereDataIsPresentedFragment.java"
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(LOG, "onActivityResult()");
switch(requestCode) {
case NEW_PEOPLE_ACTIVITY:
Log.d(LOG, "Returned with newly added person");
if (resultCode==Activity.RESULT_OK) {
mListViewAdapter.notifyDataSetChanged();
getActivity().getContentResolver().notifyChange(PeopleProvider.CONTENT_URI, null);
}
break;
}
}所有方法都被调用(通过Log.d确认),所以我不知道为什么在触发通知时没有更新游标。任何对这项工作的洞察力都将不胜感激。过去,我对常规游标没有任何问题,但在MergeCursor业务方面却没有任何进展。
发布于 2014-09-23 17:02:17
因此,我的工作方式(不管它是否正确)是通过对我的AsyncTaskLoader类进行进一步的子类划分:
@Override
protected void onStartLoading() {
forceLoad();
}从本质上说,通过将forceLoad();添加到onStartLoading()方法中,现在一切都如期而至。我能够删除对notifyDataSetChanged()的所有附加调用和对URI的通知。那条单线把一切都修好了。如果有人有一个更好的解决方案,请告诉我,但就目前而言,这是我得到的。
https://stackoverflow.com/questions/25985852
复制相似问题