ViewPager的预加载机制,会自动加载左右两边的页面,影响性能,甚至出现卡顿。解决方案如下:
public abstract class BaseFragment extends Fragment {
//view是否创建完成
private boolean isViewCreated;
//fragment是否可见
private boolean isUIVisible;
//是否加载过数据
private boolean isDataLoaded;
/**
* 懒加载数据,子类实现该方法
*/
protected abstract void lazyLoadData();
/**
* ViewPager切换时调用
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
isUIVisible = true;
lazyLoad();
} else {
isUIVisible = false;
}
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
isViewCreated = true;
lazyLoad();
}
private void lazyLoad() {
if (isViewCreated&&isUIVisible&& !isDataLoaded) {
lazyLoadData();
//数据加载完毕,恢复标记,防止重复加载
isViewCreated = false;
isUIVisible = false;
isDataLoaded =true;
}
}
//1⃣️setUserVisibleHint是在onViewCreated前面调用的,切换页面,都会调用多次
//2⃣️确保数据在onViewCreated后调用
网友评论