16

我有一个数据库, aListView和 aCustomCursorAdapter扩展CursorAdapter. 一个菜单按钮将一个项目添加到数据库中。我想要ListView更新并显示此更改。通常它不会显示这个新项目,直到我进入主屏幕并重新打开应用程序。

我最终确实通过调用cursor.requery()mCustomCursorAdapter.changeCursor(newCursor)每当我添加新项目时让它工作,但是当我在构造函数中将 autoRequery 设置为 false 时CursorAdapter,它​​的工作原理是一样的。为什么 autoRequery 设置为 false 时它会正确更新?

我使用CursorAdapter正确吗?保持列表随数据库更新的标准方法是什么?autoRequery 是做什么的?

4

2 回答 2

38

自动更新 s 的惯用且正确的方法Cursor是在创建它们时调用Cursor#setNotificationUri,然后再将它们交给任何请求它们的对象。然后ContentResolver#notifyChange在该CursorUri 的命名空间中的任何内容发生更改时调用。

例如,假设您正在创建一个简单的邮件应用程序,并且您想在新邮件到达时进行更新,同时还提供邮件的各种视图。我会定义一些基本的 Uri。

content://org.example/all_mail
content://org.example/labels
content://org.example/messages

现在,假设我想要一个光标,它给我所有邮件并在新邮件到达时更新:

Cursor c;
//code to get data
c.setNotificationUri(getContentResolver(), Uri.parse("content://org.example/all_mail");

现在新邮件到了,所以我通知:

//Do stuff to store in database
getContentResolver().notifyChange(Uri.parse("content://org.example/all_mail", null);

我还应该通知Cursor为这条新消息遇到的标签选择的所有 s

for(String label : message.getLabels() {
  getContentResolver().notifyChange(Uri.parse("content://org.example/lables/" + label, null);
}

而且,也许一个光标正在查看一条特定的消息,所以也要通知他们:

getContentResolver().notifyChange(Uri.parse("content://org.example/messages/" + message.getMessageId(), null);

getContentResolver()调用发生在访问数据的地方。因此,如果它在 aServiceContentProvider那是你setNotificationUrinotifyChange. 您不应该从访问数据的位置(例如Activity.

AlarmProvider是一个简单ContentProvider的,使用这种方法来更新Cursors。

于 2010-08-23T06:27:46.617 回答
1

我为 ListView 更新创建了下一个方法:

/**
 * Method of refreshing Cursor, Adapter and ListView after database 
 * changing
 */
public void refreshListView() {
    databaseCursor = db.getReadableDatabase().query(
            CurrentTableName, 
            null, 
            null, 
            null, 
            null, 
            null, 
            "title"+SortingOrder);
    databaseListAdapter = new DomainAdapter(this, 
            android.R.layout.simple_list_item_2, 
            databaseCursor, 
            new String[] {"title", "description"}, 
            new int[] { android.R.id.text1, android.R.id.text2 });
    databaseListAdapter.notifyDataSetChanged();
    DomainView.setAdapter(databaseListAdapter);
}

在数据库发生一些变化后,end 每次都会调用它

于 2010-10-12T13:14:24.583 回答