Googleカレンダーからすべてのユーザーのカレンダーイベントを取得してプルするアクティビティがあります。データベースに正常に挿入されますが、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;
}