2015-07-17 2 views
2

У меня есть основной фрагмент с внутренним просмотрщиком. Этот просмотрщик имеет 2 страницы (фрагменты). Все работает нормально.Фрагмент в ViewPager не отображается сразу

Когда я запускаю действие, отображается основной фрагмент, и я также хочу показать (т. Е. Данные о нагрузке) первого выгружаемого фрагмента.

В настоящее время у меня есть:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    viewPager.setCurrentItem(0); 
} 

@Override 
public void onPageSelected(int position) { 
    Fragment fragment = (Fragment) pagerAdapter.instantiateItem(viewPager, position); 
    if (fragment instanceof IPagedFragment) { 
     ((IPagedFragment) fragment).onShown(); 
    } 
} 

Это пейджера адаптер:

private static class PagerAdapter extends FragmentPagerAdapter { 
    public PagerAdapter(android.support.v4.app.FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public android.support.v4.app.Fragment getItem(int position) { 
     switch (position) { 
      case 0: return Frag1.newInstance(); 
      case 1: return Frag2.newInstance(); 
      default: return null; 
     } 
    } 

    //Other overrides... 
} 

Однако, вызов setCurrentItem не вызывает onPageSelected.

Как заставить первый фрагмент вызвать его метод onShown?

+0

Почему 'instantiateItem()', а не 'getItem (position)'? Покажите нам код вашего адаптера, пожалуйста. – shkschneider

+0

Код адаптера @shkschneider добавлен в вопрос. –

ответ

0

Вы правы, ViewPager не вызывает onPageSelected для первого элемента.

Также setCurrentItem не вызывает onPageSelected, так как текущая страница ViewPager фактически не изменилась. (Начальная страница равна 0) . Если вы хотите знать, как это работает, поближе познакомьтесь с source code (setCurrentItemInternal).

Решение должно называться onPageSelected(0) непосредственно, а не setCurrentItem.