2016-11-21 3 views
0

onLoadFinished()myadapter.swapCuesor(カーソル)を使用していますが、後でアダプタでnewViewを呼び出すのだろうか?それはアンドロイドのアダプタのAPIに書かれていないので、ここでそれを聞いています。もしそうでなければ、アダプタはどのように更新されますか?swapCursorは、終了後にアダプタ内のnewViewを呼び出します

+0

あなたは自分でデバッガを使用して見つけ出すことができます。 – Sam

+0

http://androidxref.com/7.0.0_r1/xref/frameworks/base/core/java/android/widget/CursorAdapter.java#365次回http://androidxref.comや類似のソースコードサイトを検索してみてください – pskink

答えて

2

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(); 
     } 
    } 
関連する問題