viewpager+fragment的懒加载
viewpager+fragment的使用一般会有预加载的问题,这就导致数据会请求很多次,用户体验不好,所以一般都会采用懒加载;当前页面可见时,请求网络,并且左右滑动的页面网络只请求一次。
下面是对懒加载进行封装的代码:
base类
public abstract class BaseLazyFragment extends Fragment {
private LoadingDialog loadingDialog;
protected View rootView;
private int count;
//记录开启进度条的情况 只能开一个
//当前Fragment是否处于可见状态标志,防止因ViewPager的缓存机制而导致回调函数的触发
private boolean isFragmentVisible;
//是否是第一次开启网络加载
public boolean isFirst;
private Unbinder mUnbinder;
public String token;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (rootView == null)
rootView = inflater.inflate(getLayoutResource(), container, false);
mUnbinder = ButterKnife.bind(this, rootView);
loadingDialog = new LoadingDialog(getActivity());
token = SaveSharedPreferences.getString(getActivity(), Common.TOKEN);
initView();
//可见,但是并没有加载过
if (isFragmentVisible && !isFirst) {
onFragmentVisibleChange(true);
}
return rootView;
}//获取布局文件
protected abstract int getLayoutResource();
//初始化view
protected abstract void initView();
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
isFragmentVisible = true;
}
if (rootView == null) {
return;
}
//可见,并且没有加载过
if (!isFirst && isFragmentVisible) {
onFragmentVisibleChange(true);
return;
}
//由可见——>不可见 已经加载过
if (isFragmentVisible) {
onFragmentVisibleChange(false);
isFragmentVisible = false;
}
}/**
* 当前fragment可见状态发生变化时会回调该方法
* 如果当前fragment是第一次加载,等待onCreateView后才会回调该方法,其它情况回调时机跟 {@link #setUserVisibleHint(boolean)}一致
* 在该回调方法中你可以做一些加载数据操作,甚至是控件的操作.
*
* @param isVisible true不可见 -> 可见
*false 可见-> 不可见
*/
protected void onFragmentVisibleChange(boolean isVisible) {}public void showLoading(){
loadingDialog.show();
}public void dismissLoading(){
loadingDialog.dismiss();
}@Override
public void onDestroy() {
super.onDestroy();
mUnbinder.unbind();
}
}
【viewpager+fragment的懒加载】fragment的代码:继承BaseLazyFragment
@Override
protected int getLayoutResource() {
return R.layout.fragment_essay;
}@Override
protected void initView() {}@Override
protected void onFragmentVisibleChange(boolean isVisible) {
if (isVisible) {
initData();
}
}
//这个方法做逻辑的操作
public void initData() {if (!isFirst) {
isFirst=true;
initSortData();
//这个方法是请求网络的操作,第一次进来请求网络,并把变量置为true,再次进来的时候就不会走该方法了
}
}
推荐阅读
- 一件伟大的作品
- 我种的树,开一花,结一果
- 互联网上赚钱真的很简单!按照这三个固定步骤,你就能做到
- 创建类似于网易新闻的头部
- 与濛子的初识,以及享借的碎碎念~
- ??sukin洁面??
- 沈星移———猫系外表犬系心的小公举
- 雪幸
- 农村,看不见的未来
- 赵林的留言