0
onLoadFinished()myadapter.swapCuesor(カーソル)を使用していますが、後でアダプタでnewViewを呼び出すのだろうか?それはアンドロイドのアダプタのAPIに書かれていないので、ここでそれを聞いています。もしそうでなければ、アダプタはどのように更新されますか?swapCursorは、終了後にアダプタ内のnewViewを呼び出します
onLoadFinished()myadapter.swapCuesor(カーソル)を使用していますが、後でアダプタでnewViewを呼び出すのだろうか?それはアンドロイドのアダプタのAPIに書かれていないので、ここでそれを聞いています。もしそうでなければ、アダプタはどのように更新されますか?swapCursorは、終了後にアダプタ内のnewViewを呼び出します
CursorLoaderを使用している場合は、カーソルが管理されます。
// Called when a new Loader needs to be created
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// Now create and return a CursorLoader that will take care of
// creating a Cursor for the data being displayed.
return new CursorLoader(this, ContactsContract.Data.CONTENT_URI,
PROJECTION, SELECTION, null, null);
}
// Called when a previously created loader has finished loading
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// Swap the new cursor in. (The framework will take care of closing the
// old cursor once we return.)
mAdapter.swapCursor(data);
}
// Called when a previously created loader is reset, making the data unavailable
public void onLoaderReset(Loader<Cursor> loader) {
// This is called when the last Cursor provided to onLoadFinished()
// above is about to be closed. We need to make sure we are no
// longer using it.
mAdapter.swapCursor(null);
}
あなたは、ローダはあなたのためにこれを行います開き、カーソルを自分で閉じる必要はありません。あなたがしなければならない唯一のことは、以下の3つのメソッドを実装しています。これは、swapCursorを使用する必要がある最も重要な理由です。別のCursorでスワップすると、Cursorを閉じることはありません。
public Cursor swapCursor(Cursor newCursor) {
if (newCursor == mCursor) {
return null;
}
Cursor oldCursor = mCursor;
if (oldCursor != null) {
if (mChangeObserver != null) oldCursor.unregisterContentObserver(mChangeObserver);
if (mDataSetObserver != null) oldCursor.unregisterDataSetObserver(mDataSetObserver);
}
mCursor = newCursor;
if (newCursor != null) {
if (mChangeObserver != null) newCursor.registerContentObserver(mChangeObserver);
if (mDataSetObserver != null) newCursor.registerDataSetObserver(mDataSetObserver);
mRowIDColumn = newCursor.getColumnIndexOrThrow("_id");
mDataValid = true;
// notify the observers about the new cursor
notifyDataSetChanged();
} else {
mRowIDColumn = -1;
mDataValid = false;
// notify the observers about the lack of a data set
notifyDataSetInvalidated();
}
return oldCursor;
}
ChangeCursor一方、ChangeCursorは、まず新しいCursorと交換して閉じます。このメソッドをCursorLoaderで使用すると、アプリがクラッシュすることがあります。
public void changeCursor(Cursor cursor) {
Cursor old = swapCursor(cursor);
if (old != null) {
old.close();
}
}
あなたは自分でデバッガを使用して見つけ出すことができます。 – Sam
http://androidxref.com/7.0.0_r1/xref/frameworks/base/core/java/android/widget/CursorAdapter.java#365次回http://androidxref.comや類似のソースコードサイトを検索してみてください – pskink