Viewpage + fragment 防止预加载

参考:http://blog.csdn.net/maosidiaoxian/article/details/38300627


先上代码:

父类

public abstract class BaseFragment extends Fragment {
	public View rootView;

	protected boolean isVisible;

	protected boolean isFragmentOk;

        protected boolean mHasLoadedData;

	/**Fragment 显示或隐藏 时被调用*/
	@Override
	public void setUserVisibleHint(boolean isVisibleToUser) {
		super.setUserVisibleHint(isVisibleToUser);
		if (getUserVisibleHint()) {
			isVisible = true;
			onVisible();
		} else {
			isVisible = false;
			onInvisible();
		}
	}

	/**
	 * 可见
	 */
	protected void onVisible() {

		LoadData();
	}

	/**
	 * 不可见
	 */
	protected void onInvisible() {

	}

	/** 
	 * 延迟加载
	 * 子类必须重写此方法
	 */
	protected abstract void LoadData();

}

每个子类的实现方式套路:


public class MyFragment extends BaseFragment{
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		mContext = getActivity();

		if (mRootView == null) {
			mRootView = inflater.inflate(R.layout.main_money, null);
	                /%%%%       加载视图,比如  maxText = (TextView) mRootView.findViewById(R.id.max_txt);       %%% /
            isFragmentOk = true;
            LoadData();
		}
		// 缓存的rootView需要判断是否已经被加过parent,
		// 如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错误。
		ViewGroup parent = (ViewGroup) mRootView.getParent();
		if (parent != null) {
			parent.removeView(mRootView);
		}

		return mRootView;
	}

    @Override
    protected void LoadData() {
        // TODO Auto-generated method stub
        //如果 Fragment 没有加载完毕 ,视图不可见, 数据已经加载,就不加载了
        if (!isFragmentOk || !isVisible || mHasLoadedData) {
            return;
        }
        /*        if (isonActivityResult) {
                    return;
                }*/
        //            Log.i("onResume", "onResume");
        //获取用户具体信息
         /%%%%%%%%%     注释 ①   这里加载耗时的数据(比如:网络数据)        %%%%%%%%%%%%%%/
    }

 }

以上这个套路就能解决预加载数据的问题。


以下为个人讲解:

      比如三个Fragment 分别为 A ,B,C. 嵌套在ViewPage 中。


      1、前提

         setUserVisibleHint()优先于oncreateView()方法。 oncreateView()只会在首次建立或者是预加载的时候调用。 比如 显示A ,预加载B ,那么会调用B的 oncreateView()

        但是现在切到B , 显示B 。 那么B的 oncreateView()就不会再调用了。  但是setUserVisibleHint()会在预加载和切换时每次都调用。

     2、这个套路实现的目的是,当我显示是A 时,B 会预加载,当时通过变量 isVisible  可得出B是未显示。那么就不进行B 的 数据加载(见代码中的注释 ①),但是视图oncreateView 是依然会加载的。这样就是视图先加载完毕。 切换到B时,再加载数据。

     3、在 oncreateView() 中又调用了一次 LoadData()的目的是:   第一次加载视图 (比如 第一个fragment 并不会预加载,而且setUserVisibleHint 优先于oncreateView 调用,setUserVisibleHint 去调用数据加载时 oncreateView  还未调用。而数据加载完成后一般都会填写到View中,这时可能还未加载View,这样就出现空指针的错误。所以有变量  isFragmentOk 来标示。  这样 setUserVisibleHint 去调用数据的时候,会return掉,然后就需要在 oncreateView 中去调用数据了




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值