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:
onResume()
Non travaillé. Charge toujours les données une fois ajoutées à l'activité
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
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;
}
}
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;
}
}