Подтвердить что ты не робот

Как загружать данные фрагмента только при нажатии на вкладку в PagerSlidingTabStrip

Я использую PagerSlidingTabStrip в своем проекте и показываю данные в фрагментах. Это отличная библиотека, которая отлично работает. Каждый фрагмент состоит из лекций ученых, которые загружаются из веб-службы. Код для доступа к веб-службе находится в onCreateView методе фрагмента. В настоящее время все данные фрагмента загружаются одновременно, когда они добавляются в ViewPager. Мне было интересно, есть ли способ загрузить данные Фрагмента только тогда, когда пользователь нажимает/просматривает конкретную вкладку. Не все одновременно.

Текущий код довольно стандартный, я воспользовался предоставленным примером [решение для Android]. 1

Адаптер пейджера выглядит следующим образом:

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

}

Он возвращает TWO фрагменты, Info и Lectures. Фрагмент лекций вызывает веб-сервис для получения лекций ученых.

Код операции:

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

Я попробовал добавить _tabs.setOnPageChangeListener(this); и закончил с onPageSelected(int arg0) в своей деятельности. Я думал, что теперь будет легко. Затем я изменил public Fragment getItem(int arg0) в ScholarDetailPagerAdapter выше и вернул null вместо возврата двух фрагментов. Но это вызвало исключение. Я думал, что это сделает пустые представления в пейджере.. но, конечно, я ошибся.

Чтобы убедиться, что Fragment загружает данные, когда их соответствующая вкладка нажата и видна, я также попытался переопределить следующие события и написал в них вызов загрузки данных:

  • onResume() Не работает. По-прежнему загружает данные при добавлении в действие

  • Пробовал переопределить onHiddenChanged

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

    }

Это тоже не сработало. Нет загруженных данных, как будто это событие вообще не запускается.

Как мне это сделать? Я просто хочу загрузить фрагмент, когда пользователь нажимает на вкладку.

Заранее спасибо

4b9b3361

Ответ 1

Вы можете переопределить событие setUserVisibleHint фрагмента, чтобы узнать, является ли оно видимым для пользователя, а затем загружать ваши данные. что-то вроде следующего:

boolean _areLecturesLoaded = false;

@Override
 public void setUserVisibleHint(boolean isVisibleToUser) {
     super.setUserVisibleHint(isVisibleToUser);
     if (isVisibleToUser && !_areLecturesLoaded ) {
      loadLectures(); 
      _areLecturesLoaded = true;
     }
 }

Ответ 2

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