16

データベース、、、ListViewおよびCustomCursorAdapterを拡張するがありますCursorAdapter。メニューボタンは、データベースにアイテムを追加します。ListViewを更新して、この変更を表示したいと思います。通常、ホーム画面に移動してアプリケーションを再度開くまで、この新しいアイテムは表示されません。

最終的には、呼び出すcursor.requery()mCustomCursorAdapter.changeCursor(newCursor)、新しいアイテムを追加するたびに機能するようになりましたが、コンストラクターでautoRequeryをfalseに設定すると、CursorAdapterまったく同じように機能しました。autoRequeryがfalseに設定されているのに、なぜ正しく更新されるのですか?

CursorAdapter正しく使用していますか?データベースでリストを最新の状態に保つ標準的な方法は何ですか?そして、autoRequeryは何をしますか?

4

2 に答える 2

38

sを自動的に更新する慣用的でimhoの正しい方法は、sが作成されたとき、およびそれらが要求されたものに渡される前にCursor呼び出すことです。Cursor#setNotificationUri次に、そのUriの名前空間ContentResolver#notifyChange内の何かが変更されたときに呼び出します。Cursor

たとえば、単純なメールアプリケーションを作成していて、新着メールが到着したときに更新するだけでなく、メールのさまざまなビューを提供したいとします。基本的な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また、この新しいメッセージが出会ったラベルに選択したすべてのを通知する必要があります

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

また、カーソルがその1つの特定のメッセージを表示している可能性があるので、それらにも通知します。

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

getContentResolver()呼び出しは、データがアクセスされる場所で発生します。だから、それがServiceまたはContentProviderにある場合は、あなたsetNotificationUrinotifyChange。データにアクセスする場所からそれを行うべきではありません。たとえば、Activity

AlarmProviderContentProviderこのメソッドを使用してsを更新する単純なですCursor

于 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 に答える