viewpager通常和fragment配合使用,通過viewpager的滑動操作來是實現(xiàn)fragment的顯示和隱藏.很多的場景中,我們都希望可以實現(xiàn)只有在viewpager滑動到當前fragment,也就是當前fragment可見時才去加載數(shù)據(jù),渲染view,也就是fragment的懶加載.這可以在一定程度上提高性能.
主要代碼如下:
public class LazyLoadFragment extends Fragment {
private static final long TIME_DELAY = 300;
private boolean mIsVisibleToUser;
private boolean mIsViewCreated;
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case MSG_LOAD_DATA:
//加載數(shù)據(jù)邏輯
break;
}
}
};
private boolean mHasLoadData = false;
public static final int MSG_LOAD_DATA = 1;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.mIsVisibleToUser = isVisibleToUser;
if(isVisibleToUser){
lazyLoadData();
}else{
stopLoadData();
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mIsViewCreated = true;
lazyLoadData();
}
@Override
public void onDestroyView() {
super.onDestroyView();
mIsViewCreated = false;
}
private void lazyLoadData() {
if(mIsVisibleToUser && mIsViewCreated && !mHasLoadData){
if(!mHandler.hasMessages(MSG_LOAD_DATA)){
mHandler.sendEmptyMessageDelayed(MSG_LOAD_DATA,TIME_DELAY);
}
}
}
private boolean hasLoadData(){
//增加判斷是否已經(jīng)加載了數(shù)據(jù)
//判斷數(shù)據(jù)成員是否有值了,或者recyclerview中是否已經(jīng)有子view了
return false;
}
private void stopLoadData() {
if(mHandler.hasMessages(MSG_LOAD_DATA)){
mHandler.removeMessages(MSG_LOAD_DATA);
}
}
}