前言
在开发中我们会经常用到ViewPager这个类,比如引导页的啦,主页啦,等等之类的。
一般情况下,我在ViewPger中都是放的Framgnt,这样简单有方便,但是ViewPager却会默认的缓存当前页面的最近两个页面,于是问题就产生了,我们的需求是只有切换到哪页,哪页才创建或者加载布局,但是谷歌官方的ViewPager却没有自带这个选项,就算我们用setOffscreenPageLimit(0)也不能解决这个问题:
private static final int DEFAULT_OFFSCREEN_PAGES = 1;
public void setOffscreenPageLimit(int limit) {
if (limit < DEFAULT_OFFSCREEN_PAGES) {
Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " +
DEFAULT_OFFSCREEN_PAGES);
limit = DEFAULT_OFFSCREEN_PAGES;
}
if (limit != mOffscreenPageLimit) {
mOffscreenPageLimit = limit;
populate();
}
}
从上面的代码可以看到,就算设置0、负数,它也会默认为1,为了解决这个问题,有两个方法:
第一种:重写整个ViewPager
第二种:使用Fragment的setUserVisibleHint方法(相当于Activity中的onResume方法)
第一种方法
重写整个ViewPager,下面直接上代码,需要的直接拷贝过去就好 没有什么技术含量,一般情况下我用的都是第二种方法。
代码篇幅过长,请直接到仓库复制吧!
设置setOffscreenPageLimit(0),ViewPager就不会缓存了,PS:无法和ToolBar一起使用,
第二种方式
使用Fragment的setUserVisibleHint方法(相当于Activity中的onResume方法)
public class HomeFragment extends Fragment {
private View contentView;
/**
* 是否创建
*/
protected boolean isCreate = false;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
contentView = inflater.inflate(R.layout.fragment_home, container, false);
return contentView;
}
@Override
public void onCreate(Bundle savedInstanceState) {
isCreate=true;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && isCreate) {
//相当于Fragment的onResume
//在这里处理加载数据等操作
} else {
//相当于Fragment的onPause
}
}
其它
如果不希望切换ViewPager的时候每次都重新创建Fragment的话,也很简单只需要将适配器的两个方法注释掉就好:
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//super.destroyItem(container, position, object);
}
@Override
public void destroyItem(View container, int position, Object object) {
//super.destroyItem(container, position, object);
}
//不让他们调用父类方法就不会销毁Fagment了
最后
附上自己git
https://github.com/aohanyao/NoCacheViewPager
来来扫下码,关注一下吧,或者微信搜索AndroidRookie