我有一个活动,它从谷歌日历中提取所有用户日历事件,插入到数据库中很好,但是活动的Loader for the
ListFragment 永远不会在发生更改时获得回调来刷新列表。我必须退出活动,然后再回来让加载程序正确加载所有内容。
我以前做过加载器,从来没有遇到过这个问题,我基本上是从另一个正常工作的项目中复制了加载器,所以我不明白为什么在内容更改时它没有收到回调?
这是我在数据库中的插入方法
@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);
}
就像我说的,一切都正确地进入数据库,只是加载器没有得到回调来刷新列表。
日历事件从 an 放入数据库,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;
}