Fragment懒加载

所谓懒加载,即Fragment 的 UI 对用户可见时才加载数据
  • 关键方法public void setUserVisibleHint(boolean isVisibleToUser)

具体代码:

package com.example.uilayout;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by pengshulin on 2017/5/5.
 * <p>
 * 懒加载Fragment
 */

public abstract class LazyLoadFragment extends Fragment {
    /**
     * 控件是否初完成始化
     */
    private boolean isViewCreated;
    /**
     * 是否完成数据初始化
     */
    private boolean isLoadDataCompleted;

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
//        只需要判断参数 isVisibleToUser 是否为 True 即可知道该 Fragment 的 UI 是否对用户可见

        super.setUserVisibleHint(isVisibleToUser);

//        对于单个 Fragment,setUserVisibleHint 是不会被调用的,
//        只有该 Fragment 在 ViewPager 里才会被调用。
//        一个 ViewPager + Fragment 的 Demo,
//        打印了一下 Log可以看到 setUserVisibleHint 的执行顺序如下
//        setUserVisibleHint: isVisibleToUser = false
//        onAttach
//        onCreate
//        setUserVisibleHint: isVisibleToUser = true
//        onCreateView
//        onActivityCreated
//        onStart
//        onResume
//        onPause
//        onStop
//        onDestroyView
//        onDestroy
//        onDetach

        if (isVisibleToUser && isViewCreated && !isLoadDataCompleted) {
            loadData();
        }
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(getLayoutId(), container, false);

        initView(rootView);
        isViewCreated = true;

        return rootView;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

//        * ViewPager 默认显示第一页,第一页肯定要先加载数据啊,
//        * 而且 setUserVisibleHint 的执行顺序又是在 onCreatView 之前,
//        * 同时 onCreatView 需要初始化界面和修改 isViewCreated 的值。
//        * 所以就需要在 onActivityCreated 里执行一次咯。

        if (getUserVisibleHint()) {
            loadData();
        }

    }

    /**
     * 获取布局id
     *
     * @return
     */
    protected abstract int getLayoutId();

    /**
     * 初始化控件
     *
     * @param rootView
     */
    protected abstract void initView(View rootView);

    /**
     * 加载数据
     */
    protected abstract void loadData();
}

参考地址:http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650820834&idx=1&sn=694a94615494bfcaed07188e2601724a&scene=23&srcid=0808vHgojfq1vTzIpSDNBhwq#rd

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容