所謂懶加載垦梆,即Fragment 的 UI 對用戶可見時才加載數(shù)據(jù)
- 關(guān)鍵方法
public void setUserVisibleHint(boolean isVisibleToUser)
具體代碼:
package com.example.uilayout;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by pengshulin on 2017/5/5.
* <p>
* 懶加載Fragment
*/
public abstract class LazyLoadFragment extends Fragment {
/**
* 控件是否初完成始化
*/
private boolean isViewCreated;
/**
* 是否完成數(shù)據(jù)初始化
*/
private boolean isLoadDataCompleted;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
// 只需要判斷參數(shù) isVisibleToUser 是否為 True 即可知道該 Fragment 的 UI 是否對用戶可見
super.setUserVisibleHint(isVisibleToUser);
// 對于單個 Fragment卦溢,setUserVisibleHint 是不會被調(diào)用的,
// 只有該 Fragment 在 ViewPager 里才會被調(diào)用。
// 一個 ViewPager + Fragment 的 Demo回挽,
// 打印了一下 Log可以看到 setUserVisibleHint 的執(zhí)行順序如下
// setUserVisibleHint: isVisibleToUser = false
// onAttach
// onCreate
// setUserVisibleHint: isVisibleToUser = true
// onCreateView
// onActivityCreated
// onStart
// onResume
// onPause
// onStop
// onDestroyView
// onDestroy
// onDetach
if (isVisibleToUser && isViewCreated && !isLoadDataCompleted) {
loadData();
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(getLayoutId(), container, false);
initView(rootView);
isViewCreated = true;
return rootView;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// * ViewPager 默認顯示第一頁,第一頁肯定要先加載數(shù)據(jù)啊饱狂,
// * 而且 setUserVisibleHint 的執(zhí)行順序又是在 onCreatView 之前廷没,
// * 同時 onCreatView 需要初始化界面和修改 isViewCreated 的值。
// * 所以就需要在 onActivityCreated 里執(zhí)行一次咯径荔。
if (getUserVisibleHint()) {
loadData();
}
}
/**
* 獲取布局id
*
* @return
*/
protected abstract int getLayoutId();
/**
* 初始化控件
*
* @param rootView
*/
protected abstract void initView(View rootView);
/**
* 加載數(shù)據(jù)
*/
protected abstract void loadData();
}