今天在公司写项目的时候用到了Fragment的懒加载,发现懒加载的细节还有些不理解的,所以准备写一篇文章记录一下今天用到项目中用到的内容总结一下:
关于ViewPager懒加载,必须要先说说ViewPager的加载方法:
ViewPager预加载机制
在Android中我们经常会用到ViewPager+Fragment组合。然而,有一个很让人头疼的问题就是,我们去加载数据的时候由于ViewPager的内部机制所限制,所以它会默认至少预加载一个。这让人很郁闷,所以,我就想到要封装一个Fragment来解决这个问题。
关于懒加载主要的两个方法就是
void setUserVisibleHint(boolean isVisibleToUser);//代表Fragment可见的时候回调的方法
boolean getUserVisibleHint();//获取当前Fragment是否可见的方法
通过上面两个方法对数据的加载进行判断,从而达到懒加载的目的。
具体的实现方案就是,在页面可见的时候(也就是setUserVisibleHint()回调的时候对数据进行判断,是否加载数据,其实这个时候控件已经加载出来了,只是数据没有进行请求和加载)加载数据。
public abstract class BaseFragment extends Fragment {
public Context mContext;
protected boolean isVisible = false;/*是否可见*/
protected boolean isPrepared = false;/*是否已经准备好*/
protected boolean isFirst = true;/*是否第一次加载*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
isVisible = true;
lazyLoad();
} else {
isVisible = false;
onInvisible();
}
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = getContext();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(createViewLayoutId(), container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isPrepared = true;/*数据已经准备好了*/
initPrepare();
}
/**
* 设置资源ID的方法
*
* @return 返回相应的资源ID
*/
public abstract int createViewLayoutId();
/**
* 是否已经准备好数据
*/
protected abstract void initPrepare();
/**
* 不可见的时候调用,也就是每次页面不可见的时候都会调用这个方法
*/
protected abstract void onInvisible();
protected void lazyLoad() {
/*这里isFirst可以根据实际情况去判断这个是否需要,是否需要每次进到这个页面需要刷新*/
if (!isPrepared || !isVisible /*|| !isFirst*/) {
return;
}
initData();
// isFirst = false;
}
/**
* 这里获取数据,刷新界面
*/
protected abstract void initData();
}
上面这个主要是实现懒加载的Fragment,这里主要看setUserVisibleHint(boolean isVisibleToUser)这个方法,这里面主要是判断当页面显示的时候设为可见,并且进入lazyLoad()这里如果要是已经准备好的话,就可以加载数据了,如果没有准备好就不去加载数据!这里面的注释写的很清楚了,仔细回味一下就好了,其实主要是理解上面那那个方法的话就好了。。。
网友评论