Add / Delete pages to ViewPager dynamically

前端 未结 9 1202
囚心锁ツ
囚心锁ツ 2021-01-29 23:17

I would like to add or delete pages from my view pager dynamically. Is that possible?

9条回答
  •  难免孤独
    2021-01-29 23:53

    Here's an alternative solution to this question. My adapter:

    private class PagerAdapter extends FragmentPagerAdapter implements 
                  ViewPager.OnPageChangeListener, TabListener {
    
        private List mFragments = new ArrayList();
        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 to remove and add dynamically

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

    After the advice of Peri Hartman, it started to work after I set null to ViewPager adapter and put the adapter again after the views removed. Before this the page 0 doesn't showed its list contents.

提交回复
热议问题