2013-03-01 6 views
1

Dans mon application, j'ai ListFragment:Comment s'assurer qu'il n'y a pas de transaction FragmentTransaction simultanée?

Fragment fragment = new MyFragment(); 
FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 
transaction.replace(resId, fragment, "tag"); 
transaction.addToBackStack("tag"); 
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
transaction.commit(); 

Lorsque les robinets utilisateur bouton Actualiser, il mettra à jour la liste:

Fragment newFragment = new MyFragment(); 
FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 

Fragment oldFragment = fragmentManager.findFragmentByTag(tag); 
transaction.remove(oldFragment); 
fragmentManager.popBackStack(); 

transaction.replace(resId, newFragment, "tag"); 
transaction.addToBackStack("tag"); 
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
transaction.commit(); 

Il enlèvera l'ancien fragment de la pile et la volonté ajoutez le nouveau fragment dedans.

Le problème est que si l'utilisateur appuie sur le bouton Refresh très rapidement, cela peut provoquer un problème de superposition, dont l'ancien fragment n'est pas supprimé du conteneur de fragments. Je suppose que c'est un problème de concurrence.

Si oui, existe-t-il un moyen de "verrouiller" la transaction, de sorte que l'autre transaction attende jusqu'à ce que la transaction précédente soit terminée?

+0

Ne vaudrait-il pas mieux rafraîchir les données de la liste plutôt que de créer un tout nouveau fragment? Créer un nouveau fragment à chaque fois semble un peu inutile ... – ebarrenechea

Répondre

1

Au lieu de créer un nouveau fragment utilisateur à chaque fois que les robinets sur le bouton Refesh vous pouvez simplement créer un refreshMethod en vous classe MyFragment et appeler cette méthode du parent à l'aide de l'objet de MyFragement comme suit:

Fragment fragment = new MyFragment(); 
FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 
transaction.replace(resId, fragment, "tag"); 
transaction.addToBackStack("tag"); 
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
transaction.commit(); 

sur Actualiser bouton clic:

fragment.refreshList();//Create this refresh List method in you MyFragment class 

Et dans votre méthode refreshList vous pouvez informer la liste

public void refreshList(){ 
//update the list as per your needs 
} 
+0

En supposant qu'un nouvel élément de liste soit ajouté à la liste. Comment ressemble refreshList()? rappeler setAdapter? –

+0

Si un nouvel élément de liste est ajouté à votre liste, vous pouvez appeler la méthode notifydataSetChanged sur l'adaptateur pour mettre à jour la liste. –

Questions connexes