ViewPager加载Fragment懒加载

/**
 
* Fragment预加载问题的解决方案:
 
* 1.可以懒加载的Fragment
 
* 2.切换到其他页面时停止加载数据(可选)
 
*/
 
public abstract class LazyLoadFragment extends BaseNetFragment {
 
/**
 
* 视图是否已经初初始化
 
*/
 
protected boolean isInit = false;
 
protected boolean isLoad = false;
 
protected final String TAG = "LazyLoadFragment";
 
private View view;
 
@Nullable
 
@Override
 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 
view = inflater.inflate(setContentView(), container, false);
 
isInit = true;
 
/**初始化的时候去加载数据**/
 
isCanLoadData();
 
return view;
 
}
 
/**
 
* 视图是否已经对用户可见,系统的方法
 
*/
 
@Override
 
public void setUserVisibleHint(boolean isVisibleToUser) {
 
super.setUserVisibleHint(isVisibleToUser);
 
isCanLoadData();
 
}
 
/**
 
* 是否可以加载数据
 
* 可以加载数据的条件:
 
* 1.视图已经初始化
 
* 2.视图对用户可见
 
*/
 
private void isCanLoadData() {
 
if (!isInit) {
 
return;
 
}
 
if (getUserVisibleHint()) {
 
lazyLoad();
 
isLoad = true;
 
} else {
 
if (isLoad) {
 
stopLoad();
 
}
 
}
 
}
 
/**
 
* 视图销毁的时候讲Fragment是否初始化的状态变为false
 
*/
 
@Override
 
public void onDestroyView() {
 
super.onDestroyView();
 
isInit = false;
 
isLoad = false;
 
}
 
/**
 
* 设置Fragment要显示的布局
 
*
 
* @return 布局的layoutId
 
*/
 
protected abstract int setContentView();
 
/**
 
* 获取设置的布局
 
*
 
* @return
 
*/
 
protected View getContentView() {
 
return view;
 
}
 
/**
 
* 找出对应的控件
 
*
 
* @param id
 
* @param
 
* @return
 
*/
 
protected T findViewById(int id) {
 
return (T) getContentView().findViewById(id);
 
}
 
/**
 
* 当视图初始化并且对用户可见的时候去真正的加载数据
 
*/
 
protected abstract void lazyLoad();
 
/**
 
* 当视图已经对用户不可见并且加载过数据,如果需要在切换到其他页面时停止加载数据,可以覆写此方法
 
*/
 
protected void stopLoad() {
 
}
 
}

说明:使用tablayout+viewpager+fragment,在这一刻发现fragment的生命周期变了,刚开始以为只是viewpager的预加载搞得,好我预加载全部的fragment,然后也不行,尤其是onResum和onHiddenChange的方法跟正常思路对不上啊,我想做的是每次切换到fragment,都会刷新,但是用这两个方法配合也做不到,也就第一次会被调用,后面就不动了。然后打开淘宝看了一下人家也是每次都刷新数据,呵呵,果然tablayout+viewpager+fragment配合是有大坑了,自己研究的过程就不说了,最后发现有一个方法会被调用setUserVisiableHint,这就出现了网络上说的——懒加载,就是以上的代码

也可以直接继承Fragment,用法很简单,能看到这边文章的也肯定有基础,相信你会用的。viewpager还要预加载全部!!!

以为完了吗?没有!改写生命周期开始-->

我的订单是搞定了,但是首页也是fragment,这里就设计到我们的一个登录设计了。首页下面有四个tab:首页、分类、购物车、个人中心。因为老大让设计成:如果不登录用户可以浏览首页和分类,如果点击购物车和个人中心就强制登录,如果返回还回到刚才的fragment。如果用户掉线了,在购物车和个人中心刷新,也跳转登录。逻辑大概就是这样。我就想为什么不做淘宝和京东那样,不登录也可以显示个人中心,只是没有数据。等真的开始做才知道原来这里有坑:用正常的逻辑写,Activity会初始化所有的fragment然后你就发现出现登录页了,呵呵...改:只有点击才初始化购物车和个人中心。这里先说一下fragment的生命周期:初始化会走:onResum,后面的切换会调用onHiddenChang,在这两个方法里加载数据肯定不行,需要把他们结合一下,不然我跳转登录页,再返回还会调用onResum,然后就进入死循环了,出不去,所有结合还不够,还有一个boolean值来判断是不是用户取消了登录,说了一大堆还是看怎么结合这两个方法吧

public abstract class LazyBaseFragment extends BaseNetFragment {
 
/**
 
* 视图是否已经初初始化
 
*/
 
protected boolean isLoad = false;
 
private View view;
 
@Nullable
 
@Override
 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 
view = inflater.inflate(setContentView(), container, false);
 
/**初始化的时候去加载数据**/
 
return view;
 
}
 
@Override
 
public void onHiddenChanged(boolean hidden) {
 
super.onHiddenChanged(hidden);
 
if (!hidden) {
 
isCanLoad();
 
}else {
 
isLoad = false;
 
}
 
}
 
@Override
 
public void onResume() {
 
super.onResume();
 
isCanLoad();
 
}
 
private void isCanLoad() {
 
if (!isLoad) {
 
lazyLoad();
 
isLoad = true;
 
}
 
}
 
/**
 
* 视图销毁的时候讲Fragment是否初始化的状态变为false
 
*/
 
@Override
 
public void onDestroyView() {
 
super.onDestroyView();
 
isLoad = false;
 
}
 
@Override
 
public void onPause() {
 
super.onPause();
 
isLoad = false;
 
}
 
/**
 
* 设置Fragment要显示的布局
 
*
 
* @return 布局的layoutId
 
*/
 
protected abstract int setContentView();
 
/**
 
* 获取设置的布局
 
*
 
* @return
 
*/
 
protected View getContentView() {
 
return view;
 
}
 
/**
 
* 找出对应的控件
 
*
 
* @param id
 
* @param
 
* @return
 
*/
 
protected T findViewById(int id) {
 
return (T) getContentView().findViewById(id);
 
}
 
/**
 
* 当视图初始化并且对用户可见的时候去真正的加载数据
 
*/
 
protected abstract void lazyLoad();
 
/**
 
* 当视图已经对用户不可见并且加载过数据,如果需要在切换到其他页面时停止加载数据,可以覆写此方法
 
*/
 
protected void stopLoad() {
 
}
 
}

这是子类调用的方法

@Override
 
protected void lazyLoad() {
 
if (MyApplication.isLoad) {
 
getMeData();
 
}
 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值