0

最初のアクティビティにリストビューがあり (カスタムの CursorAdapter、CursorLoader、および ContentProvider を使用)、ユーザーがリスト行をクリックすると、ユーザーがこのアイテムを削除できる別の 2 番目のアクティビティが開きます。DELETE を選択すると、データベース内のテーブルの行が削除され (ContentProvider を使用)、2nd Activity の finish() が実行されます。ただし、最初のアクティビティにはまだ古いコンテンツが表示されます。

ContentProvider が実行され、CursorLoader がすべての DB の更新、削除、および挿入を取得すると、最初のアクティビティのリストビューには、その削除された行のない新しいリストが表示されるはずだと思いました。しかし、それはまだここにあります。

以前は、requery() メソッドによって、またはデータが変更された onRestart() で CursorAdapter と ListView に渡す他のメソッドを使用して、この変更を取得していました。

削除後に最初のアクティビティの実際のデータのみを ListView に表示するにはどうすればよいか混乱しましたか?

私は使うべきかもしれません

loaderManager.restartLoader(LOADER_ID, null, mCallbacks);

? onRestart() で、しかしなぜですか?

4

2 に答える 2

1

基になるデータが変更された場合、ContentProvider によって ListView に提供されたデータは、自動的に更新されるだけではありません。登録済みの contentProviders のいずれかのデータが変更されたことを、アプリケーション全体の ContentResolver に通知する必要があります。

これを行うには、ContentResolver を介して、問題の ContentProvider の適切な URI に通知を送信します。コード行は次のようになります。

getContentResolver().notifyChange(MY_URI, null);

削除が発生したら、これを 2 番目のアクティビティに追加できます。明らかに、MY_URI をコンテンツ プロバイダーへの適切な URI に更新する必要があります。LoaderManager を正しく実装すると、ListView データが新しいデータで更新されます。

于 2013-10-05T11:44:36.380 に答える
0

私は同様のケースでこれを使用しました:

getLoaderManager().restartLoader(0, null, this);
于 2016-03-02T12:54:35.927 に答える