web-dev-qa-db-fra.com

Mes fragments dans l'onglet viewpager ne pas rafraîchir

j'ai eu viewpager avec 4 onglets .. dans chaque onglet il y a un fragment . mon premier onglet est un fragment avec un formulaire (par exemple Utilisateurs) après que je clique sur enregistrer, les données sont insérées dans la base de données .my second onglet est un autre fragment avec formulaire mais il utilise les données du premier onglet (je les récupère de la base de données) pour remplir un disque . maintenant après avoir inséré avec succès les données de mon premier onglet, dans mon second onglet le cône est vide. comme ma requête de base de données est implémentée dans onCreateView () dans le deuxième fragment, elle n’est appelée qu’une fois au démarrage de l’application. Le problème pour moi est que si je vais à l'onglet 4 puis que je retourne à l'onglet 2, mes données sont correctement placées dans mon disque, de sorte que, d'une manière ou d'une autre, balayez deux onglets de mon onglet en cours pour rafraîchir mon fragment. à mon fragment quand onCreateView () est appelé une seule fois?

Edit J'ai essayé de mettre cette méthode proposée par psykhi:

    this.mViewPager.setOffscreenPageLimit(0);
    this.mViewPager.setAdapter(this.mPagerAdapter);
    this.mViewPager.setOnPageChangeListener(this);

mais ça ne marche pas pour moi. Est-ce que je manque quelque chose?

9
BlastFire

UPDATE: Il existe un meilleur moyen, jetez un œil ici: Mettre à jour ViewPager de manière dynamique?


Supprimant le contenu de cette réponse car c'était un très mauvais moyen d'accéder à Fragments dans ViewPager, veuillez consulter le lien ci-dessus pour une meilleure approche. _

14
M-WaJeEh

Le meilleur moyen que j'ai découvert de simuler un comportement "setOffscreenPageLimit (0)" consiste à utiliser OnPageChangeListener conjointement avec le remplacement de la méthode getItemPosition dans votre adaptateur. Quelque chose comme ça:

Dans votre adaptateur de pageur personnalisé:

@Override
public int getItemPosition(Object object) {
     return POSITION_NONE;
}

Ensuite, dans votre activité contenant ViewPager:

final MyPagerAdapter adapter = new MyPagerAdapter();
pager.setAdapter(adapter);
pager.setOnPageChangeListener(new OnPageChangeListener() {
     @Override
     public void onPageSelected(int position) {
          ... anything you may need to do to handle pager state ...
          adapter.notifyDataSetChanged(); //this line will force all pages to be loaded fresh when changing between fragments
     }
}

Cela devrait avoir le même effet que de définir OffscreenPageLimit sur 0. Cependant, cette fonctionnalité est en quelque sorte opposée à ce que ViewPager est conçu pour fournir. Si vous essayez d'implémenter un ViewPager de cette manière, il peut être intéressant de réévaluer votre mise en page pour vous assurer qu'il est vraiment ce que vous voulez utiliser.

9
Dave

C'est parce que vous pouvez spécifier le nombre de fragments que votre viewpager "gardera en RAM" ( setOffScreenPageLimit (): je pense que la valeur par défaut est 1). Donc, votre deuxième fragment n'est pas rechargé. Et lorsque vous passez à un onglet 3 ou 4, vos 2 premiers fragments sont supprimés, puis recréés à votre retour.

Pour actualiser votre fragment, il y a plusieurs façons de le faire: vous pouvez implémenter votre propre interface d'écoute afin de lui indiquer quand actualiser, ou simplement appeler une méthode que vous implémenteriez pour mettre à jour votre contenu.

2
psykhi

premier remplacement dans la méthode fragment

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isVisibleToUser){
        actionView();//call the method to be refreshed
    }
    else{
        //no
    }

}
1
Issac Balaji

D'après mon expérience, ViewPagers conserve:

  • Votre onglet actuel
  • & 1 onglet de chaque côté en mémoire

Ainsi, lorsque vous basculez entre 1 et 2, rien ne se passe sous le capot - c'est comme si elles étaient simplement masquées/montrées. 

Mais lorsque vous accédez à l'onglet 4, les onglets 1 et 2 sont détruits (onDestroy () appelé). Ainsi, lorsque vous revenez à l'un d'eux, ils sont recréés tout frais (onCreate () appelé).

Comme le suggère psykhi , vous pouvez setOffScreenPageLimit () à 0, afin que chaque fragment soit créé à chaque fois que vous y accédez. 

Si vous souhaitez conserver les autres pages en mémoire à des fins de performance, comme elles ont été conçues dans cet esprit, vous pouvez utiliser un système de messagerie/publication d'événements pour envoyer un message de l'onglet 1 à l'onglet 2 en le transmettant à mettre à jour lorsque vous soumettez le formulaire à l'onglet 1. 

1
Cillian Myles

Ok peut être une réponse tardive, pourrait aider d’autres à l’avenir, c’est pourquoi j’ai récemment rencontré le même problème lors de la récupération des données de la base de données dans des onglets qu’il affichait une fois que je cliquais sur le 3ème onglet. fianlly je suis tombé sur Otto Cette bibliothèque vous permet de communiquer avec votre application .. 

Il suffit d’utiliser cette bibliothèque pour yourAdapter.notifyDataSetChanged () où que vous récupériez vos données de la base de données.

Cette vidéo m'a beaucoup aidé https://www.youtube.com/watch?v=lVqBmGK3VuA

0
fasal shah