Fragment w Viewpagerze przy użyciu FragmentPagerAdapter jest pusty przy drugim oglądaniu

Mam interfejs fragment z zakładkami wzdłuż dołu, które otwierają różne fragmenty w widoku głównym.

Mam jeden konkretny fragment, który jest listą przedmiotów. Jeśli użytkownik wybierze jeden z elementów na tej liście, otworzy się inny fragment zawierający viewpager, który przewija poziomo wszystkie elementy na liście w poprzednim fragmencie. To działa świetnie.

Viewpager używa FragmentPagerAdapter do wyświetlania elementów.

Problem przychodzi gdy użytkownik wybiera element na liście, wyświetla go, a następnie naciska przycisk na pasku kart, aby wrócić do listy, a następnie wybiera inny element. Po drugim wybraniu elementu zamiast viewpagera pojawia się pusty ekran. Nie otrzymuję żadnych błędów w moim LogCat, gdy tak się stanie.

Dlaczego viewpager pojawia się tylko za pierwszym razem?

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);
    }
}
Author: blahdiblah, 2011-10-13

11 answers

Miałem ten sam problem. Zmiana klasy nadrzędnej mojej PageAdapter z android.support.v4.app.FragmentPagerAdapter Na android.support.v4.app.FragmentStatePagerAdapter rozwiąż mój ViewPager Problem z wyświetlaniem na "drugi raz"!

 202
Author: Yann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-19 07:00:52

Udało mi się to rozwiązać zastępując getFragmentManager() getChildFragmentManager() w macierzystym fragmencie. Ten fragment rodzica tworzy instancję Androida.wsparcie.v4.app.FragmentPagerAdapter aby zawierać fragmenty, które można przeglądać (slideable), co wymaga menedżera fragmentów w konstruktorze. Do tego konstruktora przekazałem wartość zwracaną getChildFragmentManager().

Hackbod ' s link was key ( https://developer.android.com/about/versions/android-4.2.html#NestedFragments ), który został znaleziony w tym poście fragmenty w fragmentach

 72
Author: Daniel F,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-16 10:13:58

Dla mnie musiałem to nazwać na moim viewpagerze:

myViewPager.setSaveFromParentEnabled(false);

Miałem problem, w którym viewpager nie był odświeżający i widziałem tylko pusty biały ekran, na którym powinny być fragmenty. Przechodziłem przez getChildFragmentManager, ale to nie pomogło.

 12
Author: j2emanue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-20 03:19:05

W moim bardzo szczególnym przypadku, gdzie używałem CoordinatorLayout z AppBarLayout i Viewpagerem, rozwiązałem to dla mnie usuwając Android:fitsSystemWindows="true" z moich właściwości AppBarLayout XML.

Nie pytaj mnie dlaczego. Wiem, że brzmi to trochę śmiesznie i nie powinno mieć żadnej korelacji, ale to tylko ta pojedyncza linia powodowała problemy, ponieważ już używałem getChildFragmentManager () w moim adapterze. Spędziłem całe dzień debugowania mojego kodu tylko po to, aby znaleźć to, więc mam nadzieję, że zaoszczędzi to komuś innemu trochę czasu.

 8
Author: emirua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-22 00:36:46

Miałem ten sam problem, dla którego zmieniłem adapter z FragmentPagerAdapter na FragmentStatePagerAdapter i getFragmentManager() w fragmencie rodzica na getChildFragmentManager()

Powodem tego jest FragmentStatePagerAdapter jest pomocny w przechowywaniu dużej liczby stron, a pamięć związana z każdą odwiedzaną stroną jest mniejsza, ponieważ zachowuje tylko zapisany stan fragmentu, podczas gdy strona nie jest widoczna. Zmniejsza to koszty ogólne Podczas przełączania między fragmentami.

 7
Author: Yashaswi N P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 07:18:18

Udało nam się to obejść, ponownie implementując elementy widoku pagera jako standardowe widoki, a nie fragmenty i odpowiednio zmieniając adapter.

 2
Author: howettl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-29 19:24:38

To by Ci pomogło.

    viewPager.setOffscreenPageLimit(position);
 2
Author: Pardeep Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-21 07:27:27

Możesz również zainicjować adapter w przypadkach, gdy wystąpi ten błąd, gdy aplikacja zostanie zminimalizowana i Później wywołana.

@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();
}
 0
Author: Patrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-24 16:38:16

Miałem to samo, przy drugim wywołaniu adaptera pagera widok potomny zwraca NullPointerException. I zmiana adaptera w FragmentStatePagerAdapter rozwiązuje również mój problem.

 0
Author: Arka-57,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-04 02:00:28

Miałem ten sam problem na Xamarin Android z pustym ekranem za drugim razem.. Ustawienie następujących naprawiło to dla mnie.

viewPager.SaveFromParentEnabled = false;
 0
Author: Gerard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 07:18:43

Spróbuj umieścić setOffscreenPageLimit (int limit) na nadrzędnym Viewpagerze.

mViewPager.setOffscreenPageLimit(totalPages-1);
To zadziałało na mnie jak urok.

W moim przypadku miałem fragment wewnątrz TabLayout z ViewPager.

I inne ViewPager wewnątrz tego fragmentu. Po raz pierwszy wszystko działa dobrze, ale kiedy zmieniam kartę i wracam, część mojego fragmentu zniknęła.

 0
Author: Rumit Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-04 07:00:00