BaseFragment.java
6.1 KB
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
package com.yinhebairong.clasmanage.base;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
//import android.support.v4.app.Fragment;
//import android.support.v7.widget.GridLayoutManager;
//import android.support.v7.widget.LinearLayoutManager;
//import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.yinhebairong.clasmanage.base.instant.Layout;
import com.yinhebairong.clasmanage.network.ApiService;
import com.yinhebairong.clasmanage.network.ApiStore;
import butterknife.ButterKnife;
import butterknife.Unbinder;
public abstract class BaseFragment extends Fragment {
private Toast toast;
int layoutResId;
Unbinder unbinder;
// ------------------------------------------ 优化 ----------------------------------------
private String TAG = BaseFragment.class.getSimpleName();
/**
* 是否执行了lazyLoad方法
*/
private boolean isLoaded;
/**
* 是否创建了View
*/
private boolean isCreateView;
private View mRoot;
/**
* 当从另一个activity回到fragment所在的activity
* 当fragment回调onResume方法的时候,可以通过这个变量判断fragment是否可见,来决定是否要刷新数据
*/
public boolean isVisible;
/*
* 此方法在viewpager嵌套fragment时会回调
* 查看FragmentPagerAdapter源码中instantiateItem和setPrimaryItem会调用此方法
* 在所有生命周期方法前调用
* 这个基类适用于在viewpager嵌套少量的fragment页面
* 该方法是第一个回调,可以将数据放在这里处理(viewpager默认会预加载一个页面)
* 只在fragment可见时加载数据,加快响应速度
* */
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
onVisible();
} else {
onInvisible();
}
}
/*
* 因为Fragment是缓存在内存中,所以可以保存mRoot ,防止view的重复加载
* 与FragmentPagerAdapter 中destroyItem方法取消调用父类的效果是一样的,可以任选一种做法
* 推荐第二种
* */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
try {
Layout layout = getClass().getAnnotation(Layout.class);
if (layout == null) {
layoutResId = layout.value();
} else {
if (layout.value() != -1) {
layoutResId = layout.value();
} else {
throw new Exception("请在您的Fragment的Class上注解:@Layout(你的layout资源id)");
}
}
} catch (Exception e) {
e.printStackTrace();
}
if (mRoot == null) {
mRoot = LayoutInflater.from(getActivity()).inflate(layoutResId, container, false);
isCreateView = true;
unbinder = ButterKnife.bind(this, mRoot);
initView(mRoot);
initListener();
onVisible();
}
return mRoot;
}
// ------------------------------------------------- 优化 ----------------------------------------------------------------
protected void onInvisible() {
isVisible = false;
}
protected void onVisible() {
isVisible = true;
if (isLoaded) {
refreshLoad();
}
if (!isLoaded && isCreateView && getUserVisibleHint()) {
isLoaded = true;
lazyLoad();
}
}
protected abstract void initView(View root);
protected abstract void initListener();
/**
* fragment第一次可见的时候回调此方法
*/
protected abstract void lazyLoad();
/**
* 在Fragment第一次可见加载以后,每次Fragment滑动可见的时候会回调这个方法,
* 子类可以重写这个方法做数据刷新操作
*/
protected void refreshLoad() {
}
// ---------------------------------------------------- 简用 -------------------------------------------------------------
/**
* @param manager // - > manager 0 = GridLayoutManager | 1 = LinearLayoutManager
* @param rv
* @param orientation // - > orientation 0 = VERTICAL | else HORIZONTAL
* @param count // - > count 设置 GridLayoutManager 的横向数量
*/
@SuppressLint("WrongConstant")
public void setRv(RecyclerView rv, int manager, int orientation, int count) {
if (manager == 0) {
GridLayoutManager gridManager = new GridLayoutManager(getActivity(), count);
rv.setLayoutManager(gridManager);
} else {
LinearLayoutManager linearManager = new LinearLayoutManager(getActivity());
if (orientation == 0) {
linearManager.setOrientation(LinearLayoutManager.VERTICAL);
} else {
linearManager.setOrientation(LinearLayoutManager.HORIZONTAL);
}
rv.setLayoutManager(linearManager);
}
}
// -------------------------- api -------------------------------------------
public ApiService Api() {
ApiService api = ApiStore.createApi(ApiService.class);
return api;
}
protected void showToast(String message) {
if (getActivity() == null) return;
if (toast == null) toast = Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT);
else toast.setText(message);
toast.show();
}
public void startActivitys(Class<?> cls) {
super.startActivity(new Intent(getActivity(), cls));
}
@Override
public void onDestroy() {
super.onDestroy();
if(null!=unbinder){
unbinder.unbind();
}
}
}