在項目中常常遇到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的,僅僅有方法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的機制了:工具
PagerAdapter
instantiateItem(ViewGroup container, int position)
方法來建立一個Fragment,container.addView(f.mView)