2016-06-23 1 views
1

J'ai trois onglets qui peut contenir de trois fragments différents avec listview pour chaque fragment et il ressemble à ceci:Actualiser fragment ViewPager ne fonctionne pas correctement

enter image description here

Quand je suis en appuyant sur un élément de liste de bouton blanc est ajouté à l'onglet 2 et si j'appuie sur l'élément de la liste des boutons violets est ajouté à l'onglet 3. Tab3 est actualisé parce que viewPager a la limite d'écran par défaut 1, donc quand je navigue vers tab3 il est créé et à ce moment il a son nouveau listitem, mais tab2 est déjà créé quand l'application démarre donc j'ai besoin de l'actualiser. J'ai donc créé la méthode updateView() dans le fragment tab2 et j'appelle cette méthode sur OnPageChangeListener() elle met à jour la vue, mais elle est appelée chaque fois que je navigue vers tab2 et qu'elle cause lag.All je veux faire est de supprimer cette liste article et l'ajouter à tab2 et il se retire et il est ajouté à tab2 mais quand je balayez pour tab2 je ne peux pas le voir, juste après l'application fermer apparaît ou lorsque les appels fragment tab2 onResume, onCreate ...

Async procédé qui permet de charger des éléments de liste en arrière-plan: méthode

public class AchievedDreamFragment extends Fragment { 

ListView achievedListView; 
Activity activity; 
ArrayList<AchievedCloud> achievedClouds; 


AchievedListAdapter achievedListAdapter; 
AchievedActionHandler achievedActionHandler; 

private GetAvedTask atask; 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
activity = getActivity(); 
achievedActionHandler = new AchievedActionHandler(activity); 

} 


public class GetAvedTask extends AsyncTask<Void, Void, <AchievedCloud>> { 

private final WeakReference<Activity> activityWeakRef; 


public GetAvedTask(Activity context) { 
    this.activityWeakRef = new WeakReference<Activity>(context); 
} 

@Override 
protected ArrayList<AchievedCloud> doInBackground(Void... arg0) { 
    Log.e(TAG,"do in background"); 
    //achievedActionHandler = new AchievedActionHandler(activity); 
    ArrayList<AchievedCloud> dreamList = achievedActionHandler.getaDreams(); 
    return dreamList; 
} 

@Override 
protected void onPostExecute(ArrayList<AchievedCloud> adrmList) { 
    Log.e(TAG,"on Post execute"); 
    if (activityWeakRef.get() != null 
      && !activityWeakRef.get().isFinishing()) { 
     achievedClouds = adrmList; 
     if (adrmList != null) { 
      if (adrmList.size() != 0) { 
       achievedListAdapter = new AchievedListAdapter(activity, 
         adrmList); 
       achievedListView.setAdapter(achievedListAdapter); 
       achievedListAdapter.notifyDataSetChanged(); 
      } 
     } 

    } 
} 
} 

UpdateView() en même fragment où AsyncTask est:

public void updateView() { 

    atask = new GetAvedTask(activity); 
    atask.execute((Void) null); 

} 

viewpager OnPageChangeListener():

@Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

    } 

    @Override 
    public void onPageSelected(int position) { 

     if(position == 1){ 
      achievedDreamFragment.updateView(); 

     } 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 

    } 
}); 

J'ai essayé aussi bien sur l'adaptateur getItemPosition POSITION_NONE, mais il ne résout pas toutes les idées que pourrais-je essayer?

Répondre

0

J'ai eu ce même problème. Je ne suis pas sûr si c'est la façon la plus propre de le faire, mais cela a fonctionné pour moi.

J'ai créé une variable SharedPreferences. Dans onClick pour ajouter l'élément de liste dans le fragment, j'ai mis à jour la variable SharedPreferences à "refresh", et ajouté un Intent pour retourner à MainActivity. Dans la MainActivity dans onCreate, je vérifie la valeur de la variable SharedPreferences. Si elle est égale à "refresh", j'ai mis à jour la variable à "", et ajouté un Intention pour retourner au Fragment Original.

0

Vous pouvez obtenir l'instance du fragment tab2. Ensuite, appelez votre méthode updateView() sur cette instance directement:

Object anObject = viewPager.getAdapter().instantiateItem(viewPager, 1); 
// 1 is the Tab2; viewPager is the ViewPager in main activity 
if (anObject instanceof Tab2) { // Tab2 is your tab2's fragment 
    Tab2 tab2 = (Tab2) anObject; 
    tab2.updateView(); 
} 
0

Ce roi de la EventBus de "problèmes est parfait.

Première dépendance ajoutée: compile 'org.greenrobot:eventbus:3.0.0' dans votre fichier build.gradle.Pour plus d'informations voir ici: EventBus

Dans Tab2 ajouter ces méthodes:

` 
@Override 
public void onStart(){ 
    super.onStart(); 
    EventBus.getDefault().register(this); 
} 

@Override 
public void onStop(){ 
    EventBus.getDefault().unregister(this); 
    super.onStop(); 
} 
public void onEventItemAdded(EventAddItemTab2 event){ 
     loadItems(); // reload items from DB/Web using asynctask and set these items to the adapter 

} 

`

créer une nouvelle classe dans le package avec le nom, par exemple models, cette classe: public class EventAddItemTab2{ // empty here }

Puis dans Tab1 lorsque vous cliquez sur le bouton blanc appelez ceci:

EventBus.getDefault().post(new EventAddItemTab2());

Plus d'informations: Lorsque vous appelez méthode .post de EventBus, cela appellera automatiquement la méthode onEventItemAdded dans Tab2. Vous pouvez également utiliser ce modèle pour Tab3. Cette solution est parfaite pour les grandes applications où vous devez séparer la logique. Tab1, Tab2 et Tab3 ne devraient pas connaître l'existence de l'autre.

0

Désolé de dire, mais votre exigence n'est pas clair pour moi, mais de ce que je comprends si vous voulez obtenir cela avec POSITION_NONE, alors vous devez appeler adapter.notifyDatasetChanged() pour l'adaptateur viewpager. Ensuite, il rafraîchira toutes les vues et si vous avez appelé votre méthode dans l'une des méthodes surchargées, vous obtiendrez mis à jour.Alors vous pouvez l'appeler sur le clic du bouton.

0

Tout ce que je devais faire est d'appeler cette méthode sur mon fragment tab2. Il est appelé chaque fois que le fragment est visible!

@Override 
public void setMenuVisibility(boolean menuVisible) { 
    super.setMenuVisibility(menuVisible); 
    if(menuVisible){ 

     //load listview 
    } 
}