web-dev-qa-db-fra.com

Méthode pour actualiser le contenu d'un fragment lorsque les données sont modifiées (comme le rappel onCreateView)

J'ai une Activity avec un conteneur de fragments dans la présentation. 3 Fragment différents peuvent y être affichés. Il contient une liste qui affiche les données avec l'adaptateur personnalisé i créé.

Ainsi, chaque élément de la liste est créé pendant onCreateView, après avoir interrogé une base de données pour obtenir des données.

Mais parfois, certaines données peuvent changer dans ma base de données, si je souhaite la redessiner/recréer la liste.

  • Quel serait le meilleur moyen (c'est-à-dire le moins exigeant en ressources) d'actualiser ma vue fragmentée?
  • Existe-t-il une méthode pour rappeler onCreateView manuellement?
5
Heretyk

Détachez et attachez-le avec

Fragment currentFragment = getFragmentManager().findFragmentByTag("YourFragmentTag");
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.detach(currentFragment);
fragmentTransaction.attach(currentFragment);
fragmentTransaction.commit();

ou fragment de recherche avec

Fragment currentFragment = getActivity().getSupportFragmentManager().findFragmentById(R.id.container);
6
Michele Lacorte

Il existe une méthode très utile de Fragment, qui peut être utilisée pour rafraîchir un fragment.

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        //Write down your refresh code here, it will call every time user come to this fragment. 
       //If you are using listview with custom adapter, just call notifyDataSetChanged(). 
    }
}
3
M.Usman

Combinaison de deux réponses et suppression de if (isVisibleToUser), car cela permet à setUserVisibleHint d'être appelé dans un ordre asynchrone non prévu et le fragment peut être actualisé ou non. J'ai trouvé ce morceau de code stable (dans votre fragment):

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {

super.setUserVisibleHint(isVisibleToUser);

  // Refresh tab data:

  if (getFragmentManager() != null) {

    getFragmentManager()
      .beginTransaction()
      .detach(this)
      .attach(this)
      .commit();
  }
}
2
Zon

Selon FragmentTransaction # replace c'est la même chose que d'appeler remove puis add. Ainsi, vous pouvez utiliser .replace avec le gestionnaire de fragments lorsque vous démarrez le fragment ou lorsque vous souhaitez le recharger. Donc utilisez la même fonction de la onCreate ainsi que l'endroit où vous voudriez la recharger ...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        loadContentFragment();
    }
}

private void someFunctionThatChangesValue(String value) {
    mValue = value;
    loadContentFragment();
}

private void loadContentFragment() {
    ContentListFragment newFrag = ContentListFragment.newInstance();
    // passing value from activity
    Bundle args = new Bundle();
    args.putString(Constants.ARG_ACCOUNT_NAME, mValue);
    newFrag.setArguments(args);
    getSupportFragmentManager().beginTransaction()
            .replace(R.id.content_frag_container,
                    newFrag,
                    Constants.CONTENT_FRAGMENT)
            .commitNow();
}

De cette façon, il n'y a qu'une seule fonction qui charge le contenu et transmet les données. Cela suppose que vous avez une entrée dans votre mise en page avec l'ID content_frag_container. J'ai utilisé un FrameLayout. 

0
Mike

Lorsque les données d’un fragment changent, il est toujours bon de détacher et de rattacher le fragment à la variable framelayout. Dans mon cas, j'ai une listview qui montre les éléments préférés de mes utilisateurs. Une fois l’utilisateur différent d’un produit, je dois le retirer de la liste et recharger le fragment Favorites.

J'ai donc fait quelque chose comme ceci pour recharger le fragment dans la disposition du cadre:

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.frm,new FavoritesFragment()).addToBackStack(null).commit();

Ici, frm est la disposition du cadre dans la MainActivity qui contient le fragment et FavoritesFragment() est le fragment qui doit être rechargé.

Le code ci-dessus doit être exécuté chaque fois que l'utilisateur appuie sur le bouton unlike

0
Karthic Srinivasan