Fragment之set/getArguments重要性

最近改一个bug,viewpager和fragement结合使用,数据滑动的时候,页面会出现数据错乱,加上复杂的逻辑环境,费了不少劲才找到问题,主要是没有使用set/getArguments的标准方式传递参数,而是复写了父类的setArguments方法,直接在这传的参,这样滑动页面的时候会出现销毁和重建的问题,viewpager的adapter在销毁一个页面的时候会存储这个页面的各种args,存到bundle中,其中包括当调用fragment的setArguments的时存储的一份参数,但是因为复写了这个函数,并且没有调用super方法,这样传递的参数就没保存,销毁重建的时候就没有参数了。
还有一个项目里的代码,在viewpager的adapter的getitem函数中有个判断mPager.getCurrentItem() == position的条件,即是否当前展示的页面是要加载的页面,这乍看起来很奇怪,我要加载的页面当然是我当前要展示的页面,但是这里忽略一个情况,就是viewpager会预加载,展示一个页面会同时加载好多页面,这跟setOffscreenPageLimit这个函数有关,在getitem函数里加上这个条件判断,当展示的页面和加载页面是同一个,那就找到这个页面返回,如果是预加载,那就返回中间态页面,可以是轻量级的空页面,这样减少开销,当滑动到这个预加载的页面时,可以在onPageSelected里面让空页面加载真正的页面,这样做到延迟加载。
因为对于viewpager的一些原理不明白,也是造成这个bug好久看不出来的原因。当一些问题看似很难的时候,往往是我们该补充基础知识的时候了。

你可能感兴趣的:(Fragment之set/getArguments重要性)