2012-04-29 7 views
9

Quando inizio un caricatore cursore conOttenere i args bundle nella callback onLoadFinished CursorLoader

Bundle bundle = new Bundle(); 
bundle.putInt("arg", 123); 
getLoaderManager().restartLoader(0, bundle, this); 

voglio ottenere il bundle in

public void onLoadFinished(Loader<Cursor> loader, Cursor data) 

ma questo sembra possibile solo da onCreateLoader (.. .)

L'unica soluzione che posso pensare è di sottoclasse CursorLoader e aggiungere alcuni campi ai dati persistenti attraverso il caricamento su onLoadFinished (...)

Grazie!

risposta

0

Poiché si utilizza 'this' come terzo parametro di onLoadFinished, si assume che la classe stia implementando l'interfaccia LoaderManager.LoaderCallbacks. Quindi non è necessario il parametro, è possibile utilizzare un campo membro privato.

1

Non userei semplicemente un campo membro privato nella classe che implementa LoaderCallbacks perché non si sa mai esattamente quale caricatore sta finendo. Meglio fare come suggerito dal richiedente e memorizzare i dati con il caricatore. Ecco come faccio:

public static class CursorWithData<D> extends CursorWrapper { 
    private final D mData; 

    public CursorWithData(Cursor cursor, D data) { 
    super(cursor); 
    mData = data; 
    } 

    public D getData() { 
    return mData; 
    } 
} 

@Override 
public Loader<Cursor> onCreateLoader(int id, final Bundle bundle) { 
    // ... 

    return new CursorLoader(getActivity(), uri, projection, selection, args, order) { 
    @Override 
    public Cursor loadInBackground() { 
     return new CursorWithData<Bundle>(super.loadInBackground(), bundle); 
    } 
    }; 
} 

@Override 
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { 
    CursorWithData<Bundle> cursorWithData = (CursorWithData<Bundle>) cursor; 
    Bundle args = cursorWithData.getData(); 
    cursor = cursorWithData.getWrappedCursor(); // Optional if you are worried about performance 

    // ... 
} 
Problemi correlati