ViewPager+Fragment使用setCurrentItem()出现空白,界面多的情况

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导致空白的问题。这个对内存消耗也不是很大。至此我的问题就解决的。如果你遇到的问题跟我差不多也是试试这种方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值