102 votes

Le fragment dans le ViewPager utilisant FragmentPagerAdapter est vide la deuxième fois qu'il est visualisé.

J'ai une interface de fragment avec des onglets en bas qui ouvrent différents fragments dans la vue principale.

J'ai un fragment particulier qui est une liste d'éléments. Si l'utilisateur sélectionne l'un des éléments de cette liste, un autre fragment s'ouvre et contient un viewpager qui fait défiler horizontalement tous les éléments de la liste du fragment précédent. Cela fonctionne très bien.

Le viewpager utilise un FragmentPagerAdapter pour afficher les éléments.

Le problème survient lorsque l'utilisateur sélectionne un élément de la liste, le visualise, puis appuie sur le bouton de la barre d'onglets pour revenir à la liste, puis sélectionne un autre élément. La deuxième fois qu'un élément est sélectionné, un écran vide apparaît à la place du viewpager. Je ne reçois aucune erreur dans mon LogCat lorsque cela se produit.

Pourquoi le viewpager n'apparaît-il que la première fois ?

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

4voto

Rumit Patel Points 1674

Essayez de mettre setOffscreenPageLimit (int limit) sur parent ViewPager.

mViewPager.setOffscreenPageLimit(totalPages-1);

Cela a fonctionné pour moi comme un charme.

Dans mon cas, j'avais un fragment à l'intérieur de TabLayout con ViewPager.

Et un autre ViewPager à l'intérieur de ce fragment. La première fois, tout fonctionne bien, mais lorsque je change d'onglet et que je reviens, certains de mes fragments deviennent vides.

3voto

Pardeep Singh Points 35

Cela vous aiderait.

    viewPager.setOffscreenPageLimit(position);

1voto

Gerard Points 11

J'ai rencontré le même problème sur Xamarin Android avec un écran vide la deuxième fois Le réglage suivant a réglé le problème pour moi.

viewPager.SaveFromParentEnabled = false;

1voto

howettl Points 3024

Nous avons contourné ce problème en réimplémentant les éléments du view pager comme des vues standard plutôt que comme des fragments et en modifiant l'adaptateur en conséquence.

0 votes

Vous pouvez essayer de supprimer la fonction isViewFromObject(View view, Object object)

0 votes

Il doit y avoir un meilleur moyen.... :/ bien que plus je creuse dans Android, moins je me rends compte qu'il est mature.

1 votes

Les fragments imbriqués ne sont pas pris en charge La réimplémentation avec la vue standard semble donc être la bonne solution.

1voto

Classe ViewPagerAdapter extends FragmentStatePagerAdapter cela fonctionne pour moi essayez ceci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X