ViewPager正确使用+源码解析:https://baijiahao.baidu.com/s?id=1667454885722400073&wfr=spider&for=pc
文章摘要:
一、纠正了初始化一个fragment数组然后在getItem中根据索引返回对应Fragment的错误写法
因为这样违背了fragment懒加载设计的初衷,源码中是通过findFragmentByTag找是否存在需要的fragment,如果不存在才调用getItem创建一个新的Fragment,所以正确的写法应该是在getItem中根据索引返回对应的Fragment
二、优化ViewPager中Fragment的懒加载,使只在fragment显示时才回调resume方法
ViewPager的预加载默认值是1,即会预加载当前页面的左右两个页面,而且在预加载时就会调用预加载页面的onResume方法,当我们希望在Fragment页面显示才回调onResume方法,只需在FragmentStatePagerAdapter中传入Behavior:BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT即可
三、getItemPosition的正确用法
当我们想使用notifyDataSetChanged()去刷新ViewPager时,getItemPosition()的返回时决定当前的Fragment是否需要被remove。因此当我们不需要remove当前的Fragment时,则return POSITION_UNCHANGED(这样此Fragment就不会发生任何状态变化),否者则return POSITION_NONE(这样此Fragment就会被remove,然后重新初始化新的Fragment)。我们就可以做出类似于RecyclerView的diff操作。
基于自身产品逻辑,合理的重写getItemPosition(),避免不必要Fragment的销毁重建