所谓懒加载,即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();
}