2

J'essaie d'utiliser les fragments Android standard avec LiveData. La mise à jour est déclenchée par des mises à jour dans une base de données de salles. Malheureusement, mon observateur n'est pas déclenché.LiveData n'appelle pas LifecycleRegistryOwner si le fragment standard est utilisé

code Exemple:

public class MyListFragment extends Fragment implements LifecycleRegistryOwner { 

LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this); 

@Override 
public LifecycleRegistry getLifecycle() { 
    return mLifecycleRegistry; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

// ... normal code 

    AppDatabase database = AppDatabase.getDatabase(getContext()); 
    LiveData<List<RssItem>> allRssItems = database.rssItemDao().getAllRssItems(); 
    allRssItems.observe(this, rssItems -> setListContent(rssItems)); 

}

Si j'ignorer les mettre en vigueur les événements du cycle de vie, je reçois les mises à jour.

allRssItems.observeForever(new Observer<List<RssItem>>() { 
     @Override 
     public void onChanged(@Nullable List<RssItem> rssItems) { 
      Toast.makeText(getContext(), "Update", Toast.LENGTH_SHORT).show(); 
      setListContent(rssItems); 
     } 
    }); 

Quelqu'un peut-il détecter mon erreur? Je n'utilise pas le fichier v4.Fragment, mais l'Android standard, mais comme j'ai copié l'implémentation de LifecycleFragment dans mon code, je suppose que cela devrait fonctionner.

+2

Probablement une variante de [ce problème] (https://issuetracker.google.com/issues/62160522). – CommonsWare

+0

Merci, Mark, c'est effectivement le problème. L'utilisation de la solution de contournement décrite dans https://issuetracker.google.com/issues/62160522#comment1 résout le problème. – vogella

Répondre

3

Le commentaire de CommonsWare et le lien vers le bogue résolvent cette question. Pour le fragment standard, vous devez vous-même déclencher les événements de cycle de vie correspondants, par exemple, lifecycleRegistry.handleLifecycleEvent (Lifecycle.Event.ON_PAUSE);