web-dev-qa-db-fra.com

Comment charger des données de fragment uniquement lorsque vous cliquez sur son onglet dans PagerSlidingTabStrip

J'utilise PagerSlidingTabStrip dans mon projet et je montre des données en fragments. C'est une grande bibliothèque qui fonctionne très bien. Chaque fragment consiste en des conférences d'un chercheur qui sont chargées à partir d'un service Web. Le code pour accéder au service Web est dans la méthode onCreateView du fragment. Actuellement, toutes les données du fragment sont chargées en même temps lorsqu'elles sont ajoutées à ViewPager. Je me demandais s'il était possible de charger les données du fragment uniquement lorsqu'un utilisateur clique/glisse vers un onglet spécifique. Pas tout à la fois.

Le code actuel est assez standard, j'ai pris l'aide de l'exemple fourni [solution Android] . 1

L’adaptateur de téléavertisseur est le suivant:

public class ScholarDetailPagerAdapter extends FragmentPagerAdapter {

    private final String[] TITLES = { "Scholar Info", "Lectures"};
    Scholar _scholar;

    public ScholarDetailPagerAdapter(FragmentManager fm, Scholar scholar) {
        super(fm);
        _scholar = scholar;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return TITLES[position];
    }

    @Override
    public Fragment getItem(int arg0) {
        if(arg0 == 0)
            return ScholarsInfoFragment.netInstance(_scholar.Name, _scholar.Information, _scholar.ThumbnailUrl);
        else
            return ScholarLecturesFragment.newInstance(_scholar.ScholarId);
    }

    @Override
    public int getCount() {
        return TITLES.length;
    }

}

Il renvoie DEUX fragments, Info et Conférences. Un fragment de conférences appelle un service Web pour obtenir des conférences d'un chercheur.

Le code d'activité est:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // set the Above View
    setContentView(R.layout.tabbed_view);
    Scholar scholar = getScholar(getIntent());      

    _tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
    _pager = (ViewPager) findViewById(R.id.pager);
    _adapter = new ScholarDetailPagerAdapter(getSupportFragmentManager(), scholar);

    _pager.setAdapter(_adapter);

    final int pageMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources()
            .getDisplayMetrics());
    _pager.setPageMargin(pageMargin);

    _tabs.setViewPager(_pager);
} 

J'ai essayé d'ajouter _tabs.setOnPageChangeListener(this); et j'ai fini par avoir onPageSelected(int arg0) dans mon activité. Je pensais que ce serait facile maintenant. Ensuite, j'ai modifié public Fragment getItem(int arg0) dans ScholarDetailPagerAdapter ci-dessus et renvoyé null au lieu de retourner deux fragments. Mais cela a soulevé une exception. Je pensais que cela rendrait des vues vides dans un pageur .. mais bien sûr, je me suis trompé.

Pour m'assurer que Fragment charge les données lorsque l'utilisateur clique sur son onglet respectif et que celles-ci sont visibles, j'ai également essayé de remplacer ses événements suivants et d'écrire l'appel de chargement de données dans ces événements:

  1. onResume() Non travaillé. Charge toujours les données une fois ajoutées à l'activité

  2. Essayé de remplacer onHiddenChanged 

    @Override   
    public void onHiddenChanged(boolean hidden) {
    
        super.onHiddenChanged(hidden);
    
        if(!hidden){
            loadLectures();
        }
    

    }

Cela n'a pas fonctionné aussi. Aucune donnée chargée comme si cet événement n'était pas déclenché du tout.

Comment je fais ça? Je veux simplement charger un fragment lorsque l'utilisateur clique sur un onglet.

Merci d'avance

35
Aamir

Vous pouvez remplacer l'événement setUserVisibleHint du fragment pour savoir s'il est visible pour l'utilisateur, puis chargez vos données. quelque chose comme suit:

boolean _areLecturesLoaded = false;

@Override
 public void setUserVisibleHint(boolean isVisibleToUser) {
     super.setUserVisibleHint(isVisibleToUser);
     if (isVisibleToUser && !_areLecturesLoaded ) {
      loadLectures(); 
      _areLecturesLoaded = true;
     }
 }
67
Yaqub Ahmad
private boolean isLoaded =false,isVisibleToUser;

@Override

public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    this.isVisibleToUser=isVisibleToUser;
    if(isVisibleToUser && isAdded() ){
        loadData();
        isLoaded =true;
    }
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
  if(isVisibleToUser && (!isLoaded)){
        loadData();
        isLoaded=true;
    }
}
0
sss