59 votes

Ajouter / supprimer des pages à ViewPager dynamiquement

Je voudrais ajouter ou supprimer des pages de mon pageur de vue dynamiquement. Est-ce possible?

26voto

CodePro_NotYet Points 115

Oui. Vous pouvez ajouter ou supprimer des points de vue de manière dynamique à la PagerAdapter qui est de leur fournir les ViewPager et appelez - notifyDataSetChanged() de la PagerAdapter pour alerter l'touchées ViewPager sur les changements. Toutefois, lorsque vous le faites, vous devez remplacer l' getItemPosition(Object) de la PagerAdapter, qui leur dit que les articles qu'ils sont actuellement ont changé de position. Par défaut, cette fonction est activée ( POSITION_UNCHANGED, de sorte que le ViewPager ne mettra pas à jour immédiatement si vous n'avez pas surcharger cette méthode. Par exemple,

public class mAdapter extends PagerAdapter {
    List<View> mlist;

    public void addView(View view, int index) {
        mList.add(index, view);
        notifyDataSetChanged();
    }

    public void removeView(int index) {
        mList.remove(index);
        notifyDataSetChanged();
    }

    @Override
    public int getItemPosition(Object object) {
        if (mList.contains((View) object) {
            return mList.indexOf((View) object);
        } else {
            return POSITION_NONE;
        }
    }
}

Bien que, si vous souhaitez simplement ajouter ou supprimer de la vue temporairement de l'affichage, mais pas à partir de l'ensemble de données de la PagerAdapter, essayez d'utiliser setPrimaryItem(ViewGroup, int, Object) pour aller à un point de vue particulier dans le PagerAdapter les données et l' destroyItem(ViewGroup, int, Object) pour la suppression d'une vue à partir de l'écran d'affichage.

18voto

Zsombor Erdődy-Nagy Points 8376

Oui, puisque ViewPager obtient les vues enfant d'un PagerAdapter, vous pouvez ajouter de nouvelles pages / supprimer des pages dessus et appeler .notifyDataSetChanged () pour le recharger.

16voto

tc007733 Points 126

Oui, le code devrait être comme ça:

 public int addPage(View view, int position) {
        if ((position >= 0) && (position < getSize())) {
            myPagerAdapter.mListViews.add(position, view);
            myPagerAdapter.notifyDataSetChanged();
            return position;
        } else {
            return -1;
        }
    }

public View removePage(int position) {
        if ((position < 0) || (position >= getSize()) || (getSize()<=1)) {
            return null;
        } else {
            if (position == mPager.getCurrentItem()) {
                if(position == (getSize()-1)) {
                    mPager.setCurrentItem(position-1);
                } else if (position == 0){
                    mPager.setCurrentItem(1);
                }
            }
            View tempView = myPagerAdapter.mListViews.remove(position);
            myPagerAdapter.notifyDataSetChanged();
            return tempView;
        }
    }
 

Mais il y a un bug. Si l'élément actuel est 0 et que vous souhaitez supprimer la page 0, l'écran ne sera pas actualisé instantanément. Je n'ai pas trouvé de solution à ce problème.

4voto

thalespf Points 186

Voici une solution alternative à cette question. Mon adaptateur:

 private class PagerAdapter extends FragmentPagerAdapter implements 
              ViewPager.OnPageChangeListener, TabListener {

    private List<Fragment> mFragments = new ArrayList<Fragment>();
    private ViewPager mPager;
    private ActionBar mActionBar;

    private Fragment mPrimaryItem;

    public PagerAdapter(FragmentManager fm, ViewPager vp, ActionBar ab) {
        super(fm);
        mPager = vp;
        mPager.setAdapter(this);
        mPager.setOnPageChangeListener(this);
        mActionBar = ab;
    }

    public void addTab(PartListFragment frag) {
        mFragments.add(frag);
        mActionBar.addTab(mActionBar.newTab().setTabListener(this).
                            setText(frag.getPartCategory()));
    }

    @Override
    public Fragment getItem(int position) {
        return mFragments.get(position);
    }

    @Override
    public int getCount() {
        return mFragments.size();
    }

    /** (non-Javadoc)
     * @see android.support.v4.app.FragmentStatePagerAdapter#setPrimaryItem(android.view.ViewGroup, int, java.lang.Object)
     */
    @Override
    public void setPrimaryItem(ViewGroup container, int position,
            Object object) {
        super.setPrimaryItem(container, position, object);
        mPrimaryItem = (Fragment) object;
    }

    /** (non-Javadoc)
     * @see android.support.v4.view.PagerAdapter#getItemPosition(java.lang.Object)
     */
    @Override
    public int getItemPosition(Object object) {
        if (object == mPrimaryItem) {
            return POSITION_UNCHANGED;
        }
        return POSITION_NONE;
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        mPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) { }

    @Override
    public void onPageScrollStateChanged(int arg0) { }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) { }

    @Override
    public void onPageSelected(int position) {
        mActionBar.setSelectedNavigationItem(position);
    }

    /**
     * This method removes the pages from ViewPager
     */
    public void removePages() {
        mActionBar.removeAllTabs();

                    //call to ViewPage to remove the pages
        vp.removeAllViews();
        mFragments.clear();

        //make this to update the pager
        vp.setAdapter(null);
        vp.setAdapter(pagerAdapter);
    }
}
 

Code à supprimer et à ajouter dynamiquement

 //remove the pages. basically call to method removeAllViews from ViewPager
pagerAdapter.removePages();

pagerAdapter.addPage(pass your fragment);
 

Après les conseils de Peri Hartman , cela a commencé à fonctionner après avoir défini null sur l’adaptateur ViewPager et mis de nouveau l’adaptateur une fois les vues supprimées. Avant cela, la page 0 ne montrait pas le contenu de sa liste.

3voto

Paresh Mayani Points 48123

Je suis sûr que vous avez créé un adaptateur en étendant PageAdapter. Il existe donc une méthode:

  @Override
 public void destroyItem(View collection, int position, Object view) {
           ((ViewPager) collection).removeView((View) view);
 }
 

Pour un exemple détaillé, suivez cet exemple .

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