it-swarm.com.de

So laden Sie Fragmentdaten nur, wenn Sie in PagerSlidingTabStrip auf die entsprechende Registerkarte klicken

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:

  1. onResume() Nicht gearbeitet. Lädt immer noch Daten, wenn sie zur Aktivität hinzugefügt werden

  2. 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

35
Aamir

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;
     }
 }
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