在项目中常常遇到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)