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.
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);
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().
}
}
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();
}
}
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.
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