Update ViewPager dynamically?

后端 未结 20 3372
时光说笑
时光说笑 2020-11-22 02:00

I can\'t update the content in ViewPager.

What is the correct usage of methods instantiateItem() and getItem() in FragmentPagerAdapter class?

I was using onl

20条回答
  •  一整个雨季
    2020-11-22 02:40

    I've gone through all the answers above and a number of others posts but still couldn't find something that worked for me (with different fragment types along with dynamically adding and removing tabs). FWIW following approach is what worked for me (in case anyone else has same issues).

    public class MyFragmentStatePageAdapter extends FragmentStatePagerAdapter {
        private static final String TAB1_TITLE = "Tab 1";
        private static final String TAB2_TITLE = "Tab 2";
        private static final String TAB3_TITLE = "Tab 3";
    
        private ArrayList titles = new ArrayList<>();
        private Map fragmentPositions = new HashMap<>();
    
    
        public MyFragmentStatePageAdapter(FragmentManager fm) {
            super(fm);
        }
    
    
        public void update(boolean showTab1, boolean showTab2, boolean showTab3) {
            titles.clear();
    
            if (showTab1) {
                titles.add(TAB1_TITLE);
            }
            if (showTab2) {
                titles.add(TAB2_TITLE);
            }
            if (showTab3) {
                titles.add(TAB3_TITLE);
            }
            notifyDataSetChanged();
        }
    
    
        @Override
        public int getCount() {
            return titles.size();
        }
    
        @Override
        public Fragment getItem(int position) {
            Fragment fragment = null;
    
            String tabName = titles.get(position);
            if (tabName.equals(TAB1_TITLE)) { 
                fragment =  Tab1Fragment.newInstance();
            } else if (tabName.equals(TAB2_TITLE)) {
                fragment =  Tab2Fragment.newInstance();
            } else if (tabName.equals(TAB3_TITLE)) {
                fragment =  Tab3Fragmen.newInstance();
            } 
    
            ((BaseFragment)fragment).setTitle(tabName);
            fragmentPositions.put(fragment, position);
            return fragment;
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            return titles.get(position);
        }
    
        @Override
        public int getItemPosition(Object item) {
            BaseFragment fragment = (BaseFragment)item;
            String title = fragment.getTitle();
            int position = titles.indexOf(title);
    
            Integer fragmentPosition = fragmentPositions.get(item);
            if (fragmentPosition != null && position == fragmentPosition) {
                return POSITION_UNCHANGED;
            } else {
                return POSITION_NONE;
            }
        }
    
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            super.destroyItem(container, position, object);
            fragmentPositions.remove(object);
        }
    }
    

提交回复
热议问题