vp.setOffscreenPageLimit(0);
複製代碼
public void setOffscreenPageLimit(int limit) {
if (limit < 1) {
Log.w("ViewPager", "Requested offscreen page limit " + limit + " too small; defaulting to " + 1);
limit = 1;
}
if (limit != this.mOffscreenPageLimit) {
this.mOffscreenPageLimit = limit;
this.populate();
}
}
複製代碼
/**
* <pre>
* @author yangchong
* blog : https://github.com/yangchong211
* time : 2017/7/22
* desc : 懶加載
* revise: 懶加載時機:onCreateView()方法執行完畢 + setUserVisibleHint()方法返回true
* </pre>
*/
public abstract class BaseLazyFragment extends BaseFragment {
/*
* 預加載頁面回調的生命週期流程:
* setUserVisibleHint() -->onAttach() --> onCreate()-->onCreateView()-->
* onActivityCreate() --> onStart() --> onResume()
*/
/**
* 懶加載過
*/
protected boolean isLazyLoaded = false;
/**
* Fragment的View加載完畢的標記
*/
private boolean isPrepared = false;
/**
* 第一步,改變isPrepared標記
* 當onViewCreated()方法執行時,代表View已經加載完畢,此時改變isPrepared標記爲true,並調用lazyLoad()方法
*/
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isPrepared = true;
//只有Fragment onCreateView好了
//另外這裏調用一次lazyLoad()
lazyLoad();
}
/**
* 第二步
* 此方法會在onCreateView()以前執行
* 當viewPager中fragment改變可見狀態時也會調用
* 當fragment 從可見到不見,或者從不可見切換到可見,都會調用此方法
* true表示當前頁面可見,false表示不可見
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
LogUtil.d("setUserVisibleHint---"+isVisibleToUser);
//只有當fragment可見時,才進行加載數據
if (isVisibleToUser){
lazyLoad();
}
}
/**
* 調用懶加載
* 第三步:在lazyLoad()方法中進行雙重標記判斷,經過後便可進行數據加載
*/
private void lazyLoad() {
if (getUserVisibleHint() && isPrepared && !isLazyLoaded) {
showFirstLoading();
onLazyLoad();
isLazyLoaded = true;
} else {
//當視圖已經對用戶不可見而且加載過數據,若是須要在切換到其餘頁面時中止加載數據,能夠覆寫此方法
if (isLazyLoaded) {
stopLoad();
}
}
}
/**
* 視圖銷燬的時候講Fragment是否初始化的狀態變爲false
*/
@Override
public void onDestroyView() {
super.onDestroyView();
isLazyLoaded = false;
isPrepared = false;
}
/**
* 第一次可見時,操做該方法,能夠用於showLoading操做,注意這個是全局加載loading
*/
protected void showFirstLoading() {
LogUtil.i("第一次可見時show全局loading");
}
/**
* 中止加載
* 當視圖已經對用戶不可見而且加載過數據,可是沒有加載完,而只是加載loading。
* 若是須要在切換到其餘頁面時中止加載數據,能夠覆寫此方法。
* 存在問題,如何中止加載網絡
*/
protected void stopLoad(){
}
/**
* 第四步:定義抽象方法onLazyLoad(),具體加載數據的工做,交給子類去完成
*/
@UiThread
protected abstract void onLazyLoad();
}
複製代碼
/**
* <pre>
* @author yangchong
* blog : https://github.com/yangchong211
* time : 2017/7/20
* desc : fragment的父類
* revise: 注意,該類具備懶加載
* </pre>
*/
public abstract class BaseStateFragment extends BaseLazyFragment {
protected StateLayoutManager statusLayoutManager;
private View view;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
if(view==null){
view = inflater.inflate(R.layout.base_state_view, container , false);
initStatusLayout();
initBaseView(view);
}
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView(view);
initListener();
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
/**
* 獲取到子佈局
* @param view view
*/
private void initBaseView(View view) {
LinearLayout llStateView = view.findViewById(R.id.ll_state_view);
llStateView.addView(statusLayoutManager.getRootLayout());
}
/**
* 初始化狀態管理器相關操做
*/
protected abstract void initStatusLayout();
/**
* 初始化View的代碼寫在這個方法中
* @param view view
*/
public abstract void initView(View view);
/**
* 初始化監聽器的代碼寫在這個方法中
*/
public abstract void initListener();
/**
* 第一次可見狀態時,showLoading操做,注意下拉刷新操做時不要用該全局loading
*/
@Override
protected void showFirstLoading() {
super.showFirstLoading();
showLoading();
}
/*protected void initStatusLayout() {
statusLayoutManager = StateLayoutManager.newBuilder(activity)
.contentView(R.layout.common_fragment_list)
.emptyDataView(R.layout.view_custom_empty_data)
.errorView(R.layout.view_custom_data_error)
.loadingView(R.layout.view_custom_loading_data)
.netWorkErrorView(R.layout.view_custom_network_error)
.build();
}*/
/*---------------------------------下面是狀態切換方法-----------------------------------------*/
/**
* 加載成功
*/
protected void showContent() {
if (statusLayoutManager!=null){
statusLayoutManager.showContent();
}
}
/**
* 加載無數據
*/
protected void showEmptyData() {
if (statusLayoutManager!=null){
statusLayoutManager.showEmptyData();
}
}
/**
* 加載異常
*/
protected void showError() {
if (statusLayoutManager!=null){
statusLayoutManager.showError();
}
}
/**
* 加載網絡異常
*/
protected void showNetWorkError() {
if (statusLayoutManager!=null){
statusLayoutManager.showNetWorkError();
}
}
/**
* 加載loading
*/
protected void showLoading() {
if (statusLayoutManager!=null){
statusLayoutManager.showLoading();
}
}
}
//如何切換狀態呢?
showContent();
showEmptyData();
showError();
showLoading();
showNetWorkError();
//或者這樣操做也能夠
statusLayoutManager.showLoading();
statusLayoutManager.showContent();
複製代碼