Фрагмент в ViewPager с помощью FragmentPagerAdapter пуст при втором просмотре
у меня есть фрагмент интерфейса с вкладками вдоль нижней части, которые открывают различные фрагменты в главном виде.
у меня есть один конкретный фрагмент, который представляет собой список предметов. Если пользователь выбирает один из элементов в этом списке, открывается другой фрагмент, который содержит viewpager, который прокручивается горизонтально между всеми элементами в списке в предыдущем фрагменте. Это прекрасно работает.
viewpager использует FragmentPagerAdapter для отображения предметы.
проблема возникает, когда пользователь выбирает элемент в списке, рассматривает его, затем нажимает кнопку на панели вкладок, чтобы вернуться к списку, затем выбирает другой элемент. При втором выборе элемента вместо окна просмотра появляется пустой экран. Я не получаю никаких ошибок в моем LogCat, когда это происходит.
Почему viewpager появляется только в первый раз?
FragmentPagerAdapter:
public class ViewPagerAdapter extends FragmentPagerAdapter {
Cursor mCursor;
public ViewPagerAdapter(FragmentManager fm, Cursor c) {
super(fm);
mCursor = c;
}
public void changeCursor(Cursor c) {
mCursor = c;
this.notifyDataSetChanged();
}
@Override
public int getCount() {
if (mCursor == null) return 0;
else return mCursor.getCount();
}
@Override
public Fragment getItem(int position) {
mCursor.moveToPosition(position);
return TeamCardFragment.newInstance(mCursor, position);
}
}
PagerFragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Bundle bundle = getArguments();
mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION);
View mView = inflater.inflate(R.layout.team_card_master, container, false);
mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);
mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
new setAdapterTask().execute();
return mView;
}
private class setAdapterTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
return null;
}
@Override
protected void onPostExecute(Void result) {
mViewPager.setAdapter(mAdapter);
mViewPager.setCurrentItem(mCursorPosition);
}
}
11 ответов:
у меня была та же проблема. Изменение родительского класса моего PageAdapter из
android.support.v4.app.FragmentPagerAdapter
доandroid.support.v4.app.FragmentStatePagerAdapter
решить моюViewPager
проблема отображения на "второй раз"!
мне удалось решить эту проблему, заменив
getFragmentManager()
сgetChildFragmentManager()
в Родительском фрагменте. Этот родительский фрагмент создавал экземпляр android.поддержка.v4.приложение.FragmentPagerAdapter для того, чтобы содержать выгружаемой (скольжением) фрагментов, который требует фрагмент менеджер в конструкторе. В этот конструктор я передал возвращаемое значениеgetChildFragmentManager()
.ссылка хакбода была ключевой (https://developer.android.com/about/versions/android-4.2.html#NestedFragments), который был найден в этом посте фрагменты фрагменты
для меня я должен был вызвать это на моем viewpager:
myViewPager.setSaveFromParentEnabled(false);
У меня была проблема, когда viewpager не обновлялся, и все, что я видел, было пустым белым экраном, где должны быть фрагменты. Я проходил в getChildFragmentManager, но это не помогло.
в моем очень частном случае, где я использовал CoordinatorLayout с AppBarLayout и ViewPager, что решило это для меня было удаление android:fitsSystemWindows= "true" из моих свойств xml AppBarLayout.
Не спрашивай меня почему. Я знаю, что это звучит немного смешно и похоже, что у него не должно быть корреляции, но это была единственная строка, которая вызывала проблемы, поскольку я уже использовал getChildFragmentManager() в своем адаптере. Я потратил целый день на отладку моего кода, чтобы найти это, поэтому я надеюсь, что это сэкономит кому-то еще некоторое время.
у меня была та же проблема, для которой я изменил адаптер от
FragmentPagerAdapter
доFragmentStatePagerAdapter
иgetFragmentManager()
в Родительском фрагментgetChildFragmentManager()
причиной этого является
FragmentStatePagerAdapter
полезно хранить большое количество страниц, а память, связанная с каждой посещенной страницей, меньше, поскольку она сохраняет только сохраненное состояние фрагмента, пока страница не видна. Это уменьшает накладные расходы при переключении между фрагментами.
мы обошли это, повторно реализовав элементы пейджера представления как стандартные представления, а не фрагменты и соответственно изменив адаптер.
вы можете также инициализировать адаптер для случаев, когда вы испытываете эту ошибку, когда приложение свернуто, а позже позвонил.
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Bundle bundle = getArguments(); mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION); View mView = inflater.inflate(R.layout.team_card_master, container, false); mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager); initViewPagerAdapter(); return mView; } private void initViewPagerAdapter(){ mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor); new setAdapterTask().execute(); } @Override public void onResume(){ super.onResume(); initViewPagerAdapter(); }
У меня было то же самое, во второй раз, когда я вызываю адаптер пейджера, дочернее представление возвращает исключение NullPointerException. И изменение адаптера в FragmentStatePagerAdapter решить мою проблему тоже.
Я получал эту же проблему на Xamarin Android с пустым экраном во второй раз.. Установка следующего исправила это для меня.
viewPager.SaveFromParentEnabled = false;
попробуйте поставить
setOffscreenPageLimit (int limit)
on родитель ViewPager.mViewPager.setOffscreenPageLimit(totalPages-1);
это сработало для меня как шарм.
в моем случае у меня был фрагмент внутри
TabLayout
СViewPager.
и еще один
ViewPager
внутри этого фрагмента. В первый раз все работает нормально, но когда я меняю вкладку и возвращаюсь назад, часть моего фрагмента исчезла.