質問

データベースがあります ListView, 、a CustomCursorAdapter それは拡張されます CursorAdapter. 。メニューボタンは、データベースにアイテムを追加します。私は欲しい ListView この変更を更新して表示します。通常、ホーム画面に行ってアプリケーションを再開するまで、この新しいアイテムは表示されません。

私は最終的に電話をかけて動作させました cursor.requery() また mCustomCursorAdapter.changeCursor(newCursor) 新しいアイテムを追加したときはいつでも、AutoreQueryをFalseに設定したとき CursorAdapter コンストラクター、同じように機能しました。 AutoRequeryがFalseに設定されているのに、なぜ正しく更新されるのですか?

私は使用していますか CursorAdapter 正しく?データベースでリストを更新する標準的な方法は何ですか?そして、AutoreQueryは何をしますか?

役に立ちましたか?

解決

自動的に更新するための慣用と私見の正しい方法 Cursorsは呼び出すことです 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() データがアクセスされると呼び出しが発生します。したがって、それがaにある場合 Service また ContentProvider それがあなたのところです setNotificationUrinotifyChange. 。データにアクセスされる場所からそれを行うべきではありません。 Activity.

AlarmProvider 簡単です ContentProvider この方法を使用して更新します Cursors。

他のヒント

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);
}

データベースで変更された後、エンドはそれを呼び出します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top