Я видел странное поведение с моим ViewPager вместе со своим собственным FragmentStatePagerAdapter.
Иерархия My View выглядит следующим образом:
-> (1) Fragment root view (RelativeLayout)
-> (2) ViewPager
-> (3) ViewPager current fragment view
Когда фрагмент, отвечающий за корневой вид фрагмента (1), скрывается (используя операцию hid() в транзакции фрагмента), а затем отображается (с .show()), представление фрагмента, которое в настоящее время отображается в ViewPager (3) становится нулевым, хотя фрагмент все еще существует. В принципе, мой ViewPager становится полностью пустым/прозрачным.
Единственное, что я нашел, чтобы исправить это, - это позвонить
int current = myViewPager.getCurrentItem();
myViewPager.setAdapter(myAdapter);
myViewPager.setCurrentItem(current);
после отображения родительского фрагмента. Это как-то заставляет взгляды воссоздаваться и появляться на экране. К сожалению, это иногда вызывает исключения, связанные с адаптером пейджера, вызывающим unregisterDataSetObserver()
дважды на старого наблюдателя.
Есть ли лучший способ сделать это? Я предполагаю, что я спрашиваю:
Почему мои фрагментные представления внутри моего ViewPager будут уничтожены, если родительский фрагмент ViewPager скрыт?
Обновление: это также происходит, когда приложение "сведено к минимуму", а затем "восстанавливается" (путем нажатия клавиши домашнего действия и последующего возврата).
По запросу, здесь мой класс адаптера пейджера:
public class MyInfoSlidePagerAdapter extends FragmentStatePagerAdapter {
private ArrayList<MyInfo> infos = new ArrayList<MyInfo>();
public MyInfoSlidePagerAdapter (FragmentManager fm) {
super(fm);
}
public MyInfoSlidePagerAdapter (FragmentManager fm, MyInfo[] newInfos) {
super(fm);
setInfos(newInfos);
}
@Override
public int getItemPosition(Object object) {
int position = infos.indexOf(((MyInfoDetailsFragment)object).getMyInfo());
return position > 0 ? position : POSITION_NONE;
}
@Override
public CharSequence getPageTitle(int position) {
return infos.get(position).getName();
}
@Override
public Fragment getItem(int i) {
return infos.size() > 0 ? MyInfoDetailsFragment.getNewInstance(infos.get(i)) : null;
}
@Override
public int getCount() {
return infos.size();
}
public Location getMyInfoAtPosition(int i) {
return infos.get(i);
}
public void setInfos(MyInfo[] newInfos) {
infos = new ArrayList<MyInfo>(Arrays.asList(newInfos));
}
public int getPositionOfMyInfo(MyInfo info) {
return infos.indexOf(info);
}
}
Я переименовал некоторые переменные, но кроме этого, это именно то, что у меня есть.