ViewPager+Fragment使用setCurrentItem
最近在一个考试系统,需求是做100道题,可以左右翻页,右上角有个弹窗标记之前做的题的对错、总提数、当前在那道题,点击可以跳转对应的那道题。先看下效果图
需求大概就是这样的;运到的问题就是当做了十几道题之后,点击弹窗点第一道题可以正常跳转到第一题,之后在点击第十题后跳转到第十题,
界面出现的空白
,稍微滑动下屏幕界面就出来了。
问题大概描述了下,分析下原因,都知道viewPager是有缓存机制的,在代码中可以用
setOffscreenPageLimit
设置缓存界面的数量,一般我们使用viewPager+Fragmnet的时候数量不超过十个,所以设置setOffscreenPageLimit(10)
对现在大内存手机来说影响并不是很大;我这个需求是做题,题目的数量不确定,但是肯定会有很多道,当我把setOffscreenPageLimit()
数量设置为list.size()
时就不会出现问题,但是对内存消耗很大,这种方法肯定是行不通的。
还有一种方法也可以解决,就是设置setCurrentItem(position,true)把第二个参数设为true,也不会出现白屏的问题,但是就是会有翻页的动画,当翻页数量过多时比较耗时,而且用户的体验也不是很好。
还试了一种方法,网上的找到,在我的项目中没有起到作用,需求跟我的差不多,但是在我这里不起作用。
连接
问题应该就是viewPager缓存机制导致的,出现白屏可能是视图没有及时刷新,所以用new Handler延迟刷新,也是没用。
弄了一天没搞出来,头都快炸了~
最后在同事的提示下,想到了,可能是View叠加了,之前的view并没有销毁导致的,仔细一想说的好像有道理,于是动手在onCreateView
的return view之前做了判断代码如下:
private View rootView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (rootView == null) {
rootView = inflater.inflate(R.layout.fragment_brushing, container, false);
}
//缓存的rootView需要判断是否已经被加过parent, 如果有parent则从parent删除,防止发生这个rootview已经有parent的错误。
ViewGroup mViewGroup = (ViewGroup) rootView.getParent();
if (mViewGroup != null) {
mViewGroup.removeView(rootView);
}
initView(rootView);
return rootView;
}
使用FragmentPagerAdapter只会走onDestroyView
并不会销毁Fragment,在此加了一个rootView来判断之前加载的视图是否为空,不为空移除parent(不移除会报错)直接用,刷新下数据即可,没有才去创建新的,这样一来可以防止重复创建view导致空白的问题。这个对内存消耗也不是很大。至此我的问题就解决的。如果你遇到的问题跟我差不多也是试试这种方法。