深刻理解ViewPager

Viewpager的使用條件

  1. 多個Fragment滑動切換
  2. 多個Fragment的展現高度一致

在項目中常常遇到ScrollView嵌套ViewPager的作法,多個Fragment若是高度不一致,卻強行使用ViewPager,就須要許多其餘兼容代碼來完成這個需求,有些得不償失。java

因此不知足這兩個條件最好不要使用Viewpager,此外Fragment一旦onAttach到Context,在沒有及時清理掉的狀況下,會隨着Context的生命週期進行數據恢復,這個機制在不少狀況下看似無害,不過在實際項目開發過程當中會形成許多沒必要要的內存浪費。網絡

Tips: 刷新界面,須要新建一個新的Fragment,但是FragmentManager會經過反射直接生成一個Fragment保存到內存中
1)無論這個反射生成的實例直接從新建立Fragment就會形成資源浪費,並且在OnCreatView()若是有異步操做就會帶來許多其餘問題
2)但若是經過FragmentManager的fragmentManager.findFragmentByTag(name)查看是否存在Fragment實例的話,再使用該FragmentonAttach到Context中,那麼不少生命週期方法(如OnCreate())也不會再次調用異步

Viewpager如何添加子View

在看完Viewpager源碼以後,產生了一個疑惑:全篇看不到是如何添加子View的,僅僅有方法addNewItem,難道不須要ViewPager來添加? 隨後查看了PagerAdapter的源碼。ide

public abstract class FragmentPagerAdapter extends PagerAdapter {
   
    public abstract Fragment getItem(int position);

    @Override
    public void startUpdate(ViewGroup container) { }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {}

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {}

    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {}

    @Override
    public void finishUpdate(ViewGroup container) {}

    @Override
    public boolean isViewFromObject(View view, Object object) {}

    @Override
    public Parcelable saveState() {}

    @Override
    public void restoreState(Parcelable state, ClassLoader loader) {}

    public long getItemId(int position) {}
}

依舊沒有addView的蹤影。那還有誰能來管理ViewPager動態地添加View呢?
琢磨了半天,忽然想到,還有一種可能性那就是「FragmentManager」,隨後我看到了方法moveToState(Fragment f, int newState, int transit, int transitionStyle, boolean keepActive),看到這我恍然大悟,以前也看了不少網絡上的文章對Fragment的源碼進行解析,但是對於FragmentManager文章尚未認真地好好了解過,因此致使了對Framgent使用的誤解和誤用。
如今看來,能夠完整地理解ViewPager的機制了:工具

  1. 經過ViewPager的setAdapter方法,ViewPager有了一個管理子View工具PagerAdapter
  2. PagerAdapter經過實現類的instantiateItem(ViewGroup container, int position)方法來建立一個Fragment,
  3. FragmentManager在合適的時機(state==CREATED)調用container.addView(f.mView)
相關文章
相關標籤/搜索