我有一项活动可以从谷歌日历中提取所有用户日历事件,get插入到数据库中,但活动的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);
}
像我说的那样,一切都正确进入数据库,只是加载器没有得到回调来刷新列表。
日历事件是从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;
}
答案 0 :(得分:4)
在您的insert方法中,使用插入的特定行的URI调用notifyChange
,但在查询方面,URI是表示整个数据集的不同URI。 notifyChange
上的/foo/bar/1
不会通知正在侦听/foo/bar
的听众。因此,在insert()
方法中,您需要使用数据集的URI而不是特定行调用notifyChange
。