public abstract class BaseFragment extends Fragment {
View rootView; //子类的根布局
boolean isViewCreated = false; //布局是否已经加载完
boolean isCurrentVisible = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
//只有view初始化了,才能进行分发
if(isViewCreated == true) {
//加载网络数据
if (isVisibleToUser && !isCurrentVisible) {//加载数据时,只有不可见-》可见时分发
dispatchVisibleHint(true);
} else if(!isVisibleToUser && isCurrentVisible) {//停止数据更新
dispatchVisibleHint(false);
}
}
}
/**
* 分发可见事件
* @param visibleState
*/
private void dispatchVisibleHint(boolean visibleState)
{
//如果状态没有改变,则不做处理
if(isCurrentVisible == visibleState)
{
return;
}
isCurrentVisible = visibleState;
//true 可见,触发数据加载 false 触发加载的中断事件
if(visibleState)
{
onFragmentLoad();
}else{
onFragmentLoadStop();
}
}
/**
* 数据加载
*/
public void onFragmentLoad()
{
}
/**
* 数据中断
*/
public void onFragmentLoadStop()
{
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if(rootView == null) {
rootView = inflater.inflate(getLayoutRes(), null);
}
initView(rootView);
isViewCreated = true;
//只有默认fragment才会走到这里
if(getUserVisibleHint() && isHidden())
{
dispatchVisibleHint(true);
}
return rootView;
}
/**
* 初始化布局控件
* @param rootView
*/
protected abstract void initView(View rootView);
/**
* 加载布局
* @return
*/
protected abstract int getLayoutRes();
@Override
public void onResume() {
super.onResume();
if(!isCurrentVisible && getUserVisibleHint())
{
dispatchVisibleHint(true);
}
}
@Override
public void onPause() {
super.onPause();
if(isCurrentVisible && getUserVisibleHint())
{
dispatchVisibleHint(false);
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
}
}
Fragment惰性加载
最新推荐文章于 2021-04-16 16:10:57 发布