viewpage里fragment懒加载与缓存已经创建的fragment

来源:互联网 发布:首届书法艺术网络大赛 编辑:程序博客网 时间:2024/05/16 20:29

以下内容来源于网络收集:

新闻类应该最常见的就是viewpage,Fragment.

懒加载的方式基本都是通过setUserVisibleHint的方式来判断当前的Fragment是不是可见,但是如果想只有第一次加载数据后面再显示不加载数据,就必须还要做一些其他的判断
下面直接看代码:

 private boolean hasCreateView = false; private boolean isFragmentVisible; private boolean isFirstVisible;//setUserVisibleHint()在Fragment创建时会先被调用一次,传入isVisibleToUser = false    //如果当前Fragment可见,那么setUserVisibleHint()会再次被调用一次,传入isVisibleToUser = true    //如果Fragment从可见->不可见,那么setUserVisibleHint()也会被调用,传入isVisibleToUser = false    //总结:setUserVisibleHint()除了Fragment的可见状态发生变化时会被回调外,在new Fragment()时也会被回调    //如果我们需要在 Fragment 可见与不可见时干点事,用这个的话就会有多余的回调了,那么就需要重新封装一个    @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        //setUserVisibleHint()有可能在fragment的生命周期外被调用         if (!hasCreateView) {            return;        }        if (isFirstVisible && isVisibleToUser) {            onFragmentFirstVisible();            isFirstVisible = false;        }        if (isVisibleToUser) {            onFragmentVisibleChange(true);            isFragmentVisible = true;            return;        }        if (isFragmentVisible) {            isFragmentVisible = false;            onFragmentVisibleChange(false);        }    }    @Override    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {        //如果setUserVisibleHint()在rootView创建前调用时,那么        //就等到View创建完后才回调onFragmentVisibleChange(true)        //保证onFragmentVisibleChange()的回调发生在View创建完成之后,以便支持ui操作        if (!hasCreateView) {            hasCreateView = true;           if (getUserVisibleHint()) {                hasCreateView = true;                if (isFirstVisible) {                    onFragmentFirstVisible();                    isFirstVisible = false;                }                onFragmentVisibleChange(true);                isFragmentVisible = true;            }        }        super.onViewCreated(view, savedInstanceState);    }    /**     * 去除setUserVisibleHint()多余的回调场景,保证只有当fragment可见状态发生变化时才回调     * 回调时机在view创建完后,所以支持ui操作,解决在setUserVisibleHint()里进行ui操作有可能报null异常的问题     *     * 可在该回调方法里进行一些ui显示与隐藏,比如加载框的显示和隐藏     *     * @param isVisible true  不可见 -> 可见     *                  false 可见  -> 不可见     */    protected void onFragmentVisibleChange(boolean isVisible) {    }    /**     * 在fragment首次可见时回调,可在这里进行加载数据,保证只在第一次打开Fragment时才会加载数据,     * 这样就可以防止每次进入都重复加载数据     * 该方法会在 onFragmentVisibleChange() 之前调用,所以第一次打开时,可以用一个全局变量表示数据下载状态,     * 然后在该方法内将状态设置为下载状态,接着去执行下载的任务     * 最后在 onFragmentVisibleChange() 里根据数据下载状态来控制下载进度ui控件的显示与隐藏     */    protected void onFragmentFirstVisible() {    }    protected boolean isFragmentVisible() {        return isFragmentVisible;    }    @Override    public void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        initVariable();    }    @Override    public void onDestroy() {        initVariable();        super.onDestroy();    }    private void initVariable() {        isFirstVisible = true;        isFragmentVisible = false;        hasCreateView = false;    }

基本思路就是判断但是是不是已经view创建好了,是不是显示了,如果都是那就进行相应的回调

2.如果要进行Fragment的缓存就在adpter里进行数组保存,然后重写下面的方法

 @Override    public int getItemPosition(Object object) {          return POSITION_NONE;    }

这样每次加载Fragment的时候都会认为没有缓存需要调用getItem方法,这样就不会受viewPager 的 setOffscreenPageLimit影响,导致不会调用getItem方法

0 0
原创粉丝点击