简书链接:分享一个没有bug的我修改改良过的Fragment懒加载代码 文章字数:284,阅读全文大约需要1分钟 很多时候 一个fragment可能放在不同地方,但是子类是做了某些刷新的封装,到第哪些需要懒加载哪些 不需要,或者需要但是 所嵌套的层次不同,都会出现不一样的毛病 比如子fragment,放在viewpager里面放在viewpager里面的 子fragment等等。如果出现问题了设置setOnStartNeedCheckData
为true即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 package cn.qssq666.rapiddevelopframe.base.fragment; import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.BuildConfig; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import cn.qssq666.rapiddevelopframe.global.SuperAppContext; import cn.qssq666.rapiddevelopframe.utils.FragmentUtil; import cn.qssq666.rapiddevelopframe.utils.Prt; /** * Created by 情随事迁([email protected] ) on 2017/2/22. */ public abstract class BaseLazyLoadFragment extends SuperFragment implements FragmentUtil.FragmentOnStartNeedCheckVisible<BaseLazyLoadFragment> { public final String TAG = this.getClass().getName(); protected boolean mIsViewCreated; public View getView() { return mView; } private View mView; @Nullable @Override public final View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if (mView == null || mIsViewCreated == false) {//mInitfalse则重新加载 mView = onCreateViewFix(inflater, container, savedInstanceState); } return mView; } abstract protected View onCreateViewFix(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState); @Override public final void onViewCreated(View view, @Nullable Bundle savedInstanceState) { if (!mIsViewCreated) { mIsViewCreated = true; if (!isLazyLoadMode()) { if(cn.qssq666.rapiddevelopframe.BuildConfig.DEBUG){ Log.w(TAG,"LAZY-FRAGMENT-INIT-onViewCreatedFix-ABSTRACT"); } onViewCreatedFix(view, savedInstanceState); } else { lazyLoad();//但是如果不可见也是没法调用的. } } } public abstract void onViewCreatedFix(View view, @Nullable Bundle savedInstanceState); @Override public void onDestroyView() { super.onDestroyView(); if (mView != null) { ViewGroup viewGroup = ((ViewGroup) mView.getParent()); if (viewGroup != null) { viewGroup.removeView(mView); } } } /** * Fragment当前状态是否可见 */ protected boolean isVisible = false; protected boolean mIsLoadData; @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (getUserVisibleHint()) { isVisible = true; onVisible(); } else { isVisible = false; onInvisible(); } } /** * 可见 */ protected void onVisible() { lazyLoad(); } /** * 不可见 */ protected void onInvisible() { } @Override public void onStart() { super.onStart(); isVisible = true; if (onStartNeedCheckData()) { if (!hasInitData() && isLazyLoadMode()) {//在viewpager里面没问题,但是单纯的fragment如 畅销故事需要写这个.可能是因为adapter适配器的不同导致的. lazyLoad(); } } } public boolean onStartNeedCheckData() { return mOnStartNeedCheckData; } /** * 如果是fragment里面的fragment则需要。 * * @param mOnStartNeedCheckData * @return */ public BaseLazyLoadFragment setOnStartNeedCheckData(boolean mOnStartNeedCheckData) { this.mOnStartNeedCheckData = mOnStartNeedCheckData; return this; } boolean mOnStartNeedCheckData; @Override public void onStop() { super.onStop(); isVisible = false; } public String getTAG() { return "BaseLazy"; } protected boolean hasInitData() { return mIsLoadData; } /** * 延迟加载 * 子类必须重写此方法 */ protected void lazyLoad() { if (isLazyLoadMode()) { if (!mIsViewCreated || !isVisible) { Log.w(TAG, "lazyLoad call return :init?" + mIsViewCreated + ",是否可见:" + isVisible); return; } if (getActivity() == null) { Prt.e(TAG, "activity为空" + this.getClass().getSimpleName()); if (BuildConfig.DEBUG) { SuperAppContext.showToast("" + "activity为空" + this.getClass().getSimpleName()); } return; } if (mIsLoadData) { if(BuildConfig.DEBUG){ Log.w(TAG, "页面已经加载了并显示过了,忽略init " + this.getClass()); } return; } mIsLoadData = true; onViewCreatedFix(mView, null); } } @Override public void onAttach(Context context) { super.onAttach(context); if (BuildConfig.DEBUG) { Prt.w(TAG, "onAttach"); } } protected boolean isLazyLoadMode() { return lazyLoadMode; } public BaseLazyLoadFragment setLazyLoadMode(boolean lazyLoadMode) { this.lazyLoadMode = lazyLoadMode; return this; } boolean lazyLoadMode = true; }