简书链接:分享一个没有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;


}