データベースListActivity
を介してCursor
を介したAndroid SimpleCursorAdapter
があります。
アイテムをクリックすると、データベースの対応する行のフラグフィールドが切り替えられ、リストのビューを更新する必要があります。
問題は、更新されたビューが画面外に出てリサイクルされると、ビューに戻ったときに古い値がビューに表示されることです。 thrリストがredrawb(向きの変更など)になるたびに同じことが起こります。
notifydatasetchanged()
を使用してカーソルアダプターを更新しますが、効果がないようです。
カーソルも更新されるように、データベースをどのように更新する必要がありますか?
Cursor
(またはCursor
を介したCursor
のように、ListView
が取り込むもの)に反映するデータベース内のデータを変更する場合、CursorAdapter
でrequery()
を呼び出します。
Cursor
は、ODBCクライアント側カーソル-クエリ結果によって表されるすべてのデータを保持します。したがって、データベース内のデータを変更したからといって、Cursor
は保持しません。 requery()
で更新しない限り、これらの変更について知ってください。
[〜#〜] update [〜#〜]:この質問全体と回答のセットは古いため削除する必要がありますが、それは明らかに不可能です。 Android回答を求めている人は、Androidは迅速に移動するターゲットであり、2009年からの回答は一般的に新しい回答よりも悪いことに注意してください。
現在の解決策は、新しいCursor
を取得し、CursorAdapter
でchangeCursor()
またはswapCursor()
のいずれかを使用して、データ変更に影響を与えることです。
requery
は非推奨になりました。 ドキュメント から:
このメソッドは非推奨です。これを使わないでください。新しいカーソルをリクエストするだけです。これにより、非同期でこれを実行し、新しいカーソルが戻ったらリストビューを更新できます。
新しいカーソルを取得した後、theadapter.changeCursor(cursor)
を使用できます。これにより、ビューが更新されます。
ローダーと自動生成されたカーソルを使用する場合、次を呼び出すことができます。
getLoaderManager().restartLoader(0, null, this);
アクティビティで、DBで何かを変更した直後に、新しいカーソルを再生成します。イベントハンドラも定義することを忘れないでください:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoader cursorLoader =
new CursorLoader(this,
YOUR_URI,
YOUR_PROJECTION, null, null, null);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
CursorAdapterのautoRequery
プロパティをtrue
に設定したかどうかはわかりません。
アダプターはautoRequery
プロパティを確認します。 false
の場合、カーソルは変更されません。
それは簡単です。
private Db mDbAdapter;
private Cursor mCursor;
private SimpleCursorAdapter mCursorAd;
.....................................
//After removing the item from the DB, use this
.....................................
mCursor = mDbAdapter.getAllItems();
mCursorAd.swapCursor(mCursor);
またはCursorLoaderを使用...
requery()は既に非推奨です。CursorAdapterの子クラスに次のような単純なupdateUI()メソッドを実装し、データの更新後に呼び出してください:
private void updateUI(){
swapCursor(dbHelper.getCursor());
notifyDataSetChanged();
}