Viewpager Fragment懒加载

本文详细解析了ViewPagerFragment中懒加载机制的实现原理,重点介绍了如何确保数据仅在页面可见时加载,并通过不同场景下的生命周期回调说明了具体的加载流程。
Viewpager Fragment的懒加载包括两方面:
  • 当页面对于用户可见时才请求数据
  • 页面最多加载3个,即时销毁重建
    第二个系统控件默认的就是这么个处理方式,这里主要分析第一个懒加载方式的实现。

第一个加载的fragment就不说了,不用懒加载,按照第二个来说(今日头条热点tab),先研究下生命周期,分为三种情况:

1、首次滑动到相邻页


“推荐”作为第一个页面不用懒加载,“热点”tab需要懒加载,生命周期的方法依次是:

setUserVisibleHint isVisibleToUser == false
onCreate  
onCreateView                                inflate 
onViewCreated                               initView
onResume          
再滑到“热门”tab,开始加载数据
setUserVisibleHint isVisibleToUser==true    getData

2、非首次滑动到相邻页(已经看过“热点”并且又被销毁,再次滑到“推荐”tab) 比如从“推荐”–》“热点”–》“视频”–》“北京”(此时热点销毁)–》“视频”(此时执行以下声明周期方法)–》“热点”

生命周期执行方法为:

setUserVisibleHint isVisibleToUser == false  
onCreateView                    inflate                 
onViewCreated                   initView                
onResume                        getData                 

setUserVisibleHint isVisibleToUser == true   

3、直接点击tab(从“推荐”页,直接点击“视频”)


“视频”tab页面的生命周期执行方法:

setUserVisibleHint isVisibleToUser == false  
onCreate  (非首次不调用)
setUserVisibleHint isVisibleToUser == true  
onCreateView                               inflate
onViewCreated                              initView
onResume                                   getData       
下面开始分析代码的实现

主要有三个方法:生成fragment的rootView方法inflate,初始化控件initView(),填充数据getData()。不管是哪种情况,都需要把这三个方法走且只走一次。

/**
 * 懒加载机制标识
 */
protected boolean mHasLoaded = false;//是否加载过
protected boolean mHasCreated = false;//是否inflate过

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mHasCreated = true;
    return inflater.inflate(R.layout.comm_end_load_listview_header, null);
}

 @Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
            initView();
            if(mIsVisibleToUser){
            mHasLoaded = true;
            }
        }
}

 @Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    mIsVisibleToUser = isVisibleToUser;
    if (isVisibleToUser && !mHasLoaded && mHasCreated) {
        initView();
        getData();
        mHasLoaded = true;
    }
}

 @Override
public void onResume() {
    super.onResume();
    if(mHasLoaded){
        getData();
    }
}

  @Override
public void onDestroyView() {
    super.onDestroyView();
    mHasCreated = false;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值