Jak załadować dane fragmentu tylko wtedy, gdy jego karta zostanie kliknięta w PagerSlidingTabStrip
ja używamPagerSlidingTabStrip
w moim projekcie i pokazuję dane we fragmentach. To świetna biblioteka, która działa świetnie. Każdy fragment składa się z wykładów uczonego, które są ładowane z serwisu internetowego. Kod dostępu do usługi internetowej jest dostępnyonCreateView
metoda Fragmentu. Obecnie wszystkie dane fragmentu są ładowane w tym samym czasie, w którym są dodawaneViewPager
. Zastanawiałem się, czy istnieje sposób na załadowanie danych Fragmentu tylko wtedy, gdy użytkownik kliknie / przerzuci na określoną kartę. Nie wszystko na raz.
Obecny kod jest dość standardowy, skorzystałem z podanego przykładu [rozwiązanie dla Androida].1
Adapter pagera wygląda następująco:
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;
}
}
Zwraca DWA fragmenty, informacje i wykłady. Fragmenty wykładów wywołują serwis internetowy, aby uzyskać wykłady uczonego.
Kod aktywności to:
@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);
}
Próbowałem dodać_tabs.setOnPageChangeListener(this);
i skończyło się naonPageSelected(int arg0)
w mojej działalności również. Myślałem, że teraz będzie łatwo. Potem zmodyfikowałempublic Fragment getItem(int arg0)
wScholarDetailPagerAdapter
powyżej i wróciłnull
zamiast zwracać dwa fragmenty. Ale to wywołało wyjątek. Pomyślałem, że spowoduje to wyświetlenie pustych widoków w pagerach ... ale oczywiście się myliłem.
Aby upewnić się, że Fragment ładuje dane po kliknięciu odpowiedniej zakładki i jest widoczny, próbowałem także przesłonić następujące zdarzenia i napisałem w nich wywołanie ładowania danych:
onResume()
Nie zadziałało. Nadal ładuje dane po dodaniu do aktywności
Próbowałem nadpisać onHiddenChanged
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if(!hidden){
loadLectures();
}
}
To też nie zadziałało. Żadne dane nie zostały załadowane, jakby to zdarzenie nie zostało w ogóle uruchomione.
Jak mogę to zrobić? Chcę po prostu załadować fragment, gdy użytkownik kliknie kartę.
Z góry dziękuję