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

如下内容来源于网络收集:java

新闻类应该最多见的就是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建立好了,是否是显示了,若是都是那就进行相应的回调markdown

2.若是要进行Fragment的缓存就在adpter里进行数组保存,而后重写下面的方法网络

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

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

相关文章
相关标签/搜索