【发布时间】:2013-03-09 05:10:00
【问题描述】:
我一直在开发一个小型待办事项列表应用程序。我使用 CursorLoader 从内容提供者更新 ToDolistview。我写了一个函数onNewItemAdded(),当用户在文本视图中输入一个新项目并点击回车时调用它。参考如下:
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) 必须在数据发生变化时被隐式调用,对吧?
但这并没有发生。每当我添加一个新项目(该项目从onNewItemAdded 添加到数据库中,但没有明确调用restartLoader)时,暂停此活动并恢复它。我没有看到对 restartLoader 的任何隐式调用(即使 db 已更改),并且列表视图也不会随着添加的新项目而更新。这是为什么?即使应用程序不活动,CursorLoader 如何自动更新视图???
谢谢:)
编辑:我还在我的内容提供者的插入中使用了getContext().getContentResolver().notifyChange(insertedId, null)。
【问题讨论】:
标签: android android-loadermanager android-cursorloader