5

Je voudrais informer ViewPagerAdapter cet ensemble de données a changé dans Loader.onLoadFinish fonction de rappel.Comment valider des transactions Fragment dans FragmentPagerAdapter dans la méthode de rappel onLoadFinish?

Il est évité car l'état des fragments peut être sauvegardé.

De LoaderManager.LoaderCallbacks.onLoadFinished(Loader loader, D data) documentation de la méthode:

Notez que normalement une application ne peut pas engager des transactions de fragments alors que dans cet appel, car il peut se produire après l'état d'une activité est saved.`

Comment puis-je surmonter ce problème? Comment puis-je vérifier dans quel état Activity est et valider Fragment transaction?

Répondre

4

Je suis venu avec une solution suivante:

Méthode changeCursorInOtherThread est utilisé dans onLoadFinished et onLoaderReset.

Handler est créé dans 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

J'ai eu un problème similaire. Voulait montrer un DialogFragment après onLoadFinished(). Comme vous l'avez dit, il n'est pas possible de commettre une transaction de fragment à l'intérieur de onLoadFinished(). Mais ensuite j'ai réalisé que je pouvais simplement implémenter LoaderCallbacks dans le DialogFragment. Et ça fonctionne comme un charme. Au lieu d'écouter le Loader pour terminer son travail dans un Activity, je le fais à l'intérieur du Fragment.

Vous pourriez faire la même chose. Au lieu d'implémenter onLoadFinished() dans votre activité, vous pouvez simplement l'implémenter à l'intérieur de Fragments qui sont placés dans votre ViewPager. Bien sûr, dans certains cas, cela n'a aucun sens dans un ViewPager, cela dépend de la structure de vos données.

Il y a plus de discussion sur ce numéro here.

Questions connexes