我有一个 Activity ,可以从 Google 日历中提取所有用户日历事件,可以很好地插入到数据库中,但是该 Activity 的 ListFragment` 的 Loader
永远不会收到回调当有变化时刷新列表。我必须退出 Activity ,然后返回,以便加载程序正确加载所有内容。
我以前做过加载器,从来没有遇到过这个问题,我基本上是从另一个工作正常的项目复制了加载器,所以我不明白为什么它在内容更改时没有得到回调?
这是我插入数据库的方法
@Override
public Uri insert(Uri uri, ContentValues values) {
long rowID = db.insert(EVENTS_TABLE,null, values);
Uri _uri = null;
if(rowID > 0){
_uri = ContentUris.withAppendedId(CONTENT_ID_URI_BASE,rowID);
getContext().getContentResolver().notifyChange(_uri,null);
}else{
throw new SQLException("Failed to insert row into " + uri);
}
return _uri;
}
如您所见,我正在调用 notifyChange
,因此适配器会更新,但它不会更新。
这是我的ListFragment
@Override
public void onActivityCreated(Bundle state){
super.onActivityCreated(state);
lv = getListView();
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
View v = getView();
v.setClickable(true);
setEmptyText("No Events");
populate();
}
public void populate(){
mAdapter = new CalendarRowAdapter(getActivity(), R.layout.calendar_view, null,
new String[] {CalendarProvider.EVENT,CalendarProvider.LOCATION,CalendarProvider.DESCRIPTION,CalendarProvider.START},
new int[] {R.id.calendarEntryText,R.id.locationEntryText,R.id.descEntryText,R.id.dateEntryText},0);
setListAdapter(mAdapter);
getLoaderManager().initLoader(0,null,this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(getActivity(),
CalendarProvider.CONTENT_URI,new String[] {CalendarProvider.ID,CalendarProvider.EVENT,
CalendarProvider.LOCATION,CalendarProvider.DESCRIPTION,CalendarProvider.START}
,null,null,CalendarProvider.START + " COLLATE LOCALIZED ASC");
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
mAdapter.swapCursor(arg1);
if(isResumed()){
setListShown(true);
}else{
setListShownNoAnimation(true);
}
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
mAdapter.swapCursor(null);
}
就像我说的,一切都正确地进入数据库,只是加载器没有获得刷新列表的回调。
日历事件从AsyncTask
放入数据库,但我认为这不是问题
logcat 也没有显示任何错误
编辑
我的查询方法
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();
sqlBuilder.setTables(EVENTS_TABLE);
if(uriMatcher.match(uri) == 1){
sqlBuilder.setProjectionMap(mMap);
}else if(uriMatcher.match(uri) == 2){
sqlBuilder.setProjectionMap(mMap);
sqlBuilder.appendWhere(ID + "=?");
selectionArgs = DatabaseUtils.appendSelectionArgs(selectionArgs,new String[] {uri.getLastPathSegment()});
}
if(sortOrder == null || sortOrder == "")
sortOrder = START + " COLLATE LOCALIZED ASC";
Cursor c = sqlBuilder.query(db, projection, selection, selectionArgs,null,null, sortOrder);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
最佳答案
在插入方法中,您可以使用插入的特定行的 URI 调用 notifyChange
,但在查询端,该 URI 是代表整个数据集的不同 URI。 /foo/bar/1
上的 notifyChange
不会通知监听 /foo/bar
的监听器。因此,在 insert()
方法中,您需要使用数据集的 URI(而不是特定行)调用 notifyChange
。
关于android - 加载器没有获得更新 ListFragment 的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14362076/