最近练手,再做一个APP,采用MVP+Retrofit2+RxJava2+Glide组合App。
实现底部导航栏时,使用的时ViewPager+fragment+TabLayout来实现的,实现后发现一个问题,在这个项目中每次一个fragment失去焦点又获得焦点时,都会重新执行
onCreateView方法,这个可以理解的,通过fragment的生命周期可以知道,的确是这样的。但是这样不好啊,每次都要加载。所以我们要想办法将fragment的视图进行缓存。
我们在使用ListView时,遇到过对ListView进行优化,其中有一项就是对ListView的视图进行缓存。先判断视图是否存在,不存在就加载,如果已经存在了就不用加载了,直接使用存在的视图。
这里应该也是一样的,经过我上网搜集的资料,参考别的大神的做法,总结两种方法。
1,缓存创建过得View
private View view=null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if(view==null)
{
view =inflater.inflate(R.layout.fragment_first,container,false);
}
else
{
//缓存的rootView需要判断是否已经在一个ViewGroup中, 如果在,就先移除自己,要不然会发生这个rootview已经有parent的错误。
ViewGroup parent=(ViewGroup)view.getParent();
if(parent!=null)
{
parent.removeView(view);
}
}
return view;
}
2,第二种特别适合ViewPager结合使用的fragment,用来缓存多fragment来回切换情况下的fragment视图。
ViewPager提供一个setOffscreenPageLimit(int num) 方法,num的值表示缓存该fragment左右两边各num个fragment视图,默认1个。
经过测试,这两个方法都是可行的。
参考:http://m.blog.youkuaiyun.com/wukong1981/article/details/42198217