私は小さなTo-Doリストアプリに取り組んできました。CursorLoaderを使用して、コンテンツプロバイダーからToDolistviewを更新しました。onNewItemAdded()
ユーザーがテキストビューに新しいアイテムを入力してEnterをクリックすると呼び出される関数を作成しました。以下を参照してください。
public void onNewItemAdded(String newItem) {
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(ToDoContentProvider.KEY_TASK, newItem);
cr.insert(ToDoContentProvider.CONTENT_URI, values);
// getLoaderManager().restartLoader(0, null, this); // commented for the sake of testing
}
@Override
protected void onResume() {
super.onResume();
//getLoaderManager().restartLoader(0, null, this); // commented for the sake of testing
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoader loader = new CursorLoader(this,
ToDoContentProvider.CONTENT_URI, null, null, null, null);
Log.e("GOPAL", "In the onCreateLoader");
return loader;
}
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
int keyTaskIndex = cursor.getColumnIndexOrThrow(ToDoContentProvider.KEY_TASK);
Log.e("GOPAL", "In the onLoadFinished");
todoItems.clear();
if (cursor.moveToNext() == false) Log.e("GOPAL", "Empty Cursor");
else {
while (cursor.moveToNext()) {
ToDoItem newItem = new ToDoItem(cursor.getString(keyTaskIndex));
todoItems.add(newItem);
}
aa.notifyDataSetChanged(); // aa is arrayadapter used for the listview
}
}
私が読んだところによると、コンテンツプロバイダーデータベースにデータが変更されるたびに、CursorLoaderはビューを自動的に更新します。つまりgetLoaderManager().restartLoader(0, null, this)
、データに変更があるたびに暗黙的に呼び出される必要があると思いますよね?しかし、それは起こっていません。新しいアイテムを追加するたびに(アイテムはからdbに追加されますがonNewItemAdded
、restartLoaderは明示的に呼び出されません)、このアクティビティを一時停止して再開します。(dbが変更されても)restartLoaderへの暗黙の呼び出しは表示されず、リストビューも新しいアイテムが追加されて更新されません。何故ですか?CursorLoader
アプリがアクティブでない場合でも、ビューを自動的に更新するにはどうすればよいですか?ありがとう :)
getContext().getContentResolver().notifyChange(insertedId, null)
編集:私は私のコンテンツプロバイダーの挿入にも使用しました。