完美实现ViewPager+Fragment懒加载

2018-10-31  本文已影响0人  mt大山

1、首先创建一个BaseFragment基类,在基类里实现懒加载,以便其他子类调用。

public class BaseFragment extends Fragment{

  private View view;
  // 判断view是否为空标志,防止创建view是报空指针异常。(因为Fragment的setUserVisibleHint方法在onCreateView之前调用,如果在此方法中加载控件会报空指针异常)
  private boolean isViewCreate;
  //判断当前Fragment是否显示标志
  private boolean isFragmentVisiable;


  //加载布局
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        view = inflater.inflate(R.layout.fgt_base, container, false);
        return view;
}
  //初始化标志(在onCreate里调用)
  private void initFlag(){
        isViewCreate = false;
        isFragmentVisiable = false;
  }
   @Override
    public void onCreate( Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initFlag();
    }


  //调用setUserVisibleHint
 @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        //判断view是否为空 如果为空返回,不为空 代表 view已经创建
        if (view == null) {
            return;
        }
        isViewCreate = true;
        if (isFragmentVisiable) {
            onFragmentVisiableChange(true);
            isFragmentVisiable = true;
            return;
        }
        if (isFragmentVisiable) {
            onFragmentVisiableChange(false);
            isFragmentVisiable = false;
        }
    }



    @Override
    public void onViewCreated( View view,  Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (!hasCreateView && getUserVisibleHint()) {
            onFragmentVisiableChange(true);
            isVisiableFlag = true;
        }
    }

    /*
        *
        * 如果Fragment第一次加载,等待OnCreateView后才会进入该回调方法,其他情    
        * 况和setUserVisiableHint(boolean一致)
        * isVisiable true 不可见->可见
        *                 false 可见 ->不可见
        *
        * */
    protected void onFragmentVisiableChange(boolean isVisiable) {

    }
}

到此BaseFragment已经封装完毕
2、在Fragment里使用

新建Fragment类继承BaseFragment 调用onFragmentVisiableChange()方法即可。

上一篇下一篇

猜你喜欢

热点阅读