Ich verwende PagerSlidingTabStrip
in meinem Projekt und zeige Daten in Fragmenten. Es ist eine großartige Bibliothek, die großartig funktioniert. Jedes Fragment besteht aus Vorlesungen eines Gelehrten, die von einem Webservice geladen werden. Der Code für den Zugriff auf den Webdienst befindet sich in der onCreateView
-Methode des Fragments. Derzeit werden alle Daten des Fragments gleichzeitig geladen, wenn sie zu ViewPager
hinzugefügt werden. Ich habe mich gefragt, ob es eine Möglichkeit gibt, die Daten des Fragments nur dann zu laden, wenn ein Benutzer auf eine bestimmte Registerkarte klickt/wischt. Nicht alles auf einmal.
Der aktuelle Code ist ziemlich Standard, ich habe Hilfe aus dem bereitgestellten Beispiel genommen [Android-Lösung] . 1
Pager-Adapter lautet wie folgt:
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;
}
}
Es werden ZWEI Fragmente, Informationen und Vorträge zurückgegeben. Vorträge fragment ruft einen Webservice an, um die Vorträge eines Gelehrten zu erhalten.
Aktivitätscode ist:
@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);
}
Ich habe versucht, _tabs.setOnPageChangeListener(this);
hinzuzufügen, und hatte am Ende auch onPageSelected(int arg0)
in meiner Aktivität. Ich dachte, es wäre jetzt einfach. Dann änderte ich public Fragment getItem(int arg0)
in ScholarDetailPagerAdapter
und gab null
zurück, anstatt zwei Fragmente zurückzugeben. Aber das hat eine Ausnahme ausgelöst. Ich dachte es würde leere Ansichten in Pager rendern .. aber natürlich lag ich falsch.
Um sicherzustellen, dass Fragment Daten lädt, wenn die entsprechende Registerkarte angeklickt wird und sichtbar ist, habe ich auch versucht, die folgenden Ereignisse zu überschreiben und den Aufruf zum Laden von Daten in diese zu schreiben:
onResume()
Nicht gearbeitet. Lädt immer noch Daten, wenn sie zur Aktivität hinzugefügt werden
Versucht, onHiddenChanged zu überschreiben
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if(!hidden){
loadLectures();
}
}
Das hat auch nicht funktioniert. Keine Daten geladen, als ob dieses Ereignis überhaupt nicht ausgelöst wird.
Wie mache ich das? Ich möchte einfach ein Fragment laden, wenn der Benutzer auf eine Registerkarte klickt.
Danke im Voraus
Sie könnten das setUserVisibleHint
-Ereignis des Fragments überschreiben, um zu erfahren, ob es für den Benutzer sichtbar ist, und dann Ihre Daten laden. etwas wie folgendes:
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;
}
}