Replace Fragment inside a ViewPager

后端 未结 18 1334
别那么骄傲
别那么骄傲 2020-11-22 00:26

I\'m trying to use Fragment with a ViewPager using the FragmentPagerAdapter. What I\'m looking for to achieve is to replace a fragment, positioned

18条回答
  •  迷失自我
    2020-11-22 00:53

    I found simple solution, which works fine even if you want add new fragments in the middle or replace current fragment. In my solution you should override getItemId() which should return unique id for each fragment. Not position as by default.

    There is it:

    public class DynamicPagerAdapter extends FragmentPagerAdapter {
    
    private ArrayList mPages = new ArrayList();
    private ArrayList mFragments = new ArrayList();
    
    public DynamicPagerAdapter(FragmentManager fm) {
        super(fm);
    }
    
    public void replacePage(int position, Page page) {
        mPages.set(position, page);
        notifyDataSetChanged();
    }
    
    public void setPages(ArrayList pages) {
        mPages = pages;
        notifyDataSetChanged();
    }
    
    @Override
    public Fragment getItem(int position) {
        if (mPages.get(position).mPageType == PageType.FIRST) {
            return FirstFragment.newInstance(mPages.get(position));
        } else {
            return SecondFragment.newInstance(mPages.get(position));
        }
    }
    
    @Override
    public int getCount() {
        return mPages.size();
    }
    
    @Override
    public long getItemId(int position) {
        // return unique id
        return mPages.get(position).getId();
    }
    
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container, position);
        while (mFragments.size() <= position) {
            mFragments.add(null);
        }
        mFragments.set(position, fragment);
        return fragment;
    }
    
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
        mFragments.set(position, null);
    }
    
    @Override
    public int getItemPosition(Object object) {
        PagerFragment pagerFragment = (PagerFragment) object;
        Page page = pagerFragment.getPage();
        int position = mFragments.indexOf(pagerFragment);
        if (page.equals(mPages.get(position))) {
            return POSITION_UNCHANGED;
        } else {
            return POSITION_NONE;
        }
    }
    }
    

    Notice: In this example FirstFragment and SecondFragment extends abstract class PageFragment, which has method getPage().

提交回复
热议问题