5

Desidero notificare ViewPagerAdapter il set di dati modificato nella funzione di richiamata Loader.onLoadFinish.Come eseguire il commit delle transazioni Fragment in FragmentPagerAdapter nel metodo di callback onLoadFinish?

Viene impedito perché è possibile che lo stato dei frammenti venga salvato.

Da LoaderManager.LoaderCallbacks.onLoadFinished(Loader loader, D data) metodo documentazione:

Nota che normalmente un'applicazione non è permesso commettere transazioni frammento, mentre nel presente invito, dal momento che può accadere dopo lo stato di un'attività è saved.`

Come posso superare questo problema? Come posso verificare in quale stato è Activity e commettere la transazione Fragment?

risposta

4

Sono venuto con seguente soluzione:

Metodo changeCursorInOtherThread è utilizzato in onLoadFinished e onLoaderReset.

Handler viene creato in Activity:

private Handler mHandler = new Handler(); 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    mSaved = true; 

} 

private void changeCursorInOtherThread(final Cursor data) { 
    if(!mSaved){ 
     mHandler.post(new Runnable() { 

      @Override 
      public void run() { 
       mViewPagerAdapter.changeCursor(data); 
      } 
     }); 
    } 
} 
1

Ho avuto un problema simile. Volevo mostrare uno DialogFragment dopo il onLoadFinished(). Come hai detto, non è possibile eseguire il commit della transazione di frammenti all'interno di onLoadFinished(). Ma poi mi sono reso conto che potevo semplicemente implementare lo LoaderCallbacks nello DialogFragment. E funziona come un fascino. Invece di ascoltare il Loader per completare il suo lavoro all'interno di uno Activity, lo faccio all'interno dello Fragment.

Si potrebbe fare lo stesso. Invece di implementare lo onLoadFinished() all'interno della tua attività, potresti semplicemente implementarlo all'interno di Fragments che sono posizionati nel tuo ViewPager. Naturalmente in alcuni casi non ha senso in un ViewPager, dipende dalla struttura dei dati.

C'è più discussione su questo numero here.