Android:Cursoradapterの使用方法は?
-
30-09-2019 - |
質問
データベースがあります ListView
, 、a CustomCursorAdapter
それは拡張されます CursorAdapter
. 。メニューボタンは、データベースにアイテムを追加します。私は欲しい ListView
この変更を更新して表示します。通常、ホーム画面に行ってアプリケーションを再開するまで、この新しいアイテムは表示されません。
私は最終的に電話をかけて動作させました cursor.requery()
また mCustomCursorAdapter.changeCursor(newCursor)
新しいアイテムを追加したときはいつでも、AutoreQueryをFalseに設定したとき CursorAdapter
コンストラクター、同じように機能しました。 AutoRequeryがFalseに設定されているのに、なぜ正しく更新されるのですか?
私は使用していますか CursorAdapter
正しく?データベースでリストを更新する標準的な方法は何ですか?そして、AutoreQueryは何をしますか?
解決
自動的に更新するための慣用と私見の正しい方法 Cursor
sは呼び出すことです Cursor#setNotificationUri
それらが作成されたとき、そして彼らがそれらを要求したものに引き渡される前に。次に、電話します ContentResolver#notifyChange
その中に何かがあります Cursor
uriの名前空間が変更されます。
たとえば、簡単なメールアプリケーションを作成していて、新しいメールが到着したときに更新したいだけでなく、メールでさまざまなビューを提供したいとしたとします。基本的な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
それがあなたのところです setNotificationUri
と notifyChange
. 。データにアクセスされる場所からそれを行うべきではありません。 Activity
.
AlarmProvider
簡単です ContentProvider
この方法を使用して更新します Cursor
s。
他のヒント
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);
}
データベースで変更された後、エンドはそれを呼び出します