Fragment懒加载

来源:互联网 发布:睡眠软件app 编辑:程序博客网 时间:2024/05/21 17:52

所谓懒加载,即用户切到对应的fragment时才加载数据(Android默认加载可见fragment和可见fragment的左右fragment即3个fragment数据,这样可能会导致界面产生卡顿)

如何判断fragment是否可见

Fragmet提供了一个setUserVisibleHint方法里有个isVisibleToUser参数如果为True则为可见否则为不可见:

@Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if (isVisibleToUser ) {            //可见        }else{            //不可见        }    }

setUserVisibleHint 在什么时候调用?

对于单个 Fragment,setUserVisibleHint 是不会被调用的,只有该 Fragment 在 ViewPager 里才会被调用。而setUserVisibleHint在fragment的生命周期调用顺序如下

-> setUserVisibleHint(false) -> onAttach-> onCreate -> setUserVisibleHint(true)  -> onCreateView -> onActivityCreated -> .... -> onDetach

LazyFragment

了解了原理,现在改写Fragment,增加loadData方法来进行数据加载

/** * Created by JokAr on 16/8/10. */public abstract class LazyFragment extends Fragment {    //控件是否已经初始化    private boolean isCreateView = false;    //是否已经加载过数据    public boolean isLoadData = false;    /**     * 返回layoutView     * @param inflater     * @param container     * @return     */    public abstract View getView(LayoutInflater inflater, ViewGroup container);    /**     * 初始化控件     */    public abstract void initViews(View view);    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        View view = getView(inflater, container);        initViews(view);        isCreateView = true;        return view;    }    //此方法在控件初始化前调用,所以不能在此方法中直接操作控件会出现空指针    @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        if (isVisibleToUser && isCreateView && !isLoadData) {            loadData();        }    }    /**     * 加载数据     */    public void loadData() {        //如果没有加载过就加载,否则就不再加载了        if (!isLoadData) {            //加载数据操作            isLoadData = true;        }    }    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        //第一个加载fragment会调用        if (getUserVisibleHint())            loadData();    }}

这样就完成了,

  • getView 返回fragment的layout,
  • initViews 初始化控件,
  • loadData 加载数据

注意viewPager不保存Fragment问题

  • 参考:http://blog.csdn.net/guo807015563/article/details/42081799
  • 或者设置viewPager.setOffscreenPageLimit
0 0
原创粉丝点击