您的位置:首页 > 移动开发 > Android开发

Android中ViewPager常用功能6----viewpager和Fragment结合时懒加载

2017-07-28 15:08 399 查看
关于viewpager和Fragment结合,仿微信既能点击又能滑动的选项卡功能已在
http://blog.csdn.net/zhaihaohao1/article/details/76142314 中已实现

但是在切换Fragment时会出现重复加载,我测试了一下加载如下

启动加载 Fragment01  Fragment02 Fragment03 Fragment01  Fragment02

点击Fragment02 时加载 Fragment03 

点击Fragment03 时加载 Fragment04

点击Fragment04 时不加载

点击Fragment01 时加载 Fragment01  Fragment02

点击Fragment02 时加载 Fragment03......

那么怎样才能做到,Fragment只在显示时加载,且只加载一次。

通过查看Fragment的源码可以发现它有setUserVisibleHint()这个方法,源码如下:

/** * Set a hint to the system about whether this fragment's UI is currently visible
* to the user. This hint defaults to true and is persistent across fragment instance
* state save and restore.
* * <p>An app may set this to false to indicate that the fragment's UI is
* scrolled out of visibility or is otherwise not directly visible to the user.
* This may be used by the system to prioritize operations such as fragment lifecycle updates
* or loader ordering behavior.</p>
* * @param isVisibleToUser true if this fragment's UI is currently visible to the user (default),
* false if it is not. */
public void setUserVisibleHint(boolean isVisibleToUser) {
if(!mUserVisibleHint&& isVisibleToUser && mState < STARED){
mFragmentManager.performPendingDeferredStart(this);
}
mUserVisibleHint = isVisibleToUser;
mDeferStart = !isVisibleToUser;
}


该方法用于告诉系统,这个Fragment的UI是否是可见的。所以我们只要在这个方法中判断加载数据即可

具体代码如下:

package com.example.viewpagertest4;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.orhanobut.logger.Logger;

/**
* A simple {@link Fragment} subclass.
*/
public class Fragment01 extends Fragment {
//  判断加载数据
private  boolean isLoadFinish=false;
private View view;

public Fragment01() {
// Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(view==null){
view= View.inflate(getActivity(),R.layout.fragment_fragment01,null);
}
return  view;
}
//  boolean isVisibleToUser判断fragment页面是否显示
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser&&!isLoadFinish){
Logger.t("222").d("网络请求Fragment01");
//          网络请求加载数据,如果加载完成后把isLoadFinish=true
httpNet();
}
}
/**
* 接收到数据
*/
private Handler handler = new Handler(){
public void handleMessage(Message msg){
switch (msg.what) {
case  1:
//          无论显示和不显示,让他都不加载数据,使用下拉刷新时,在重新加载数据
isLoadFinish=true;
break;
}
}
};

/**
* 模拟网路请求
*/
private void  httpNet(){
new Thread(){
public void run(){
try {
Thread.sleep(3000);
handler.sendEmptyMessage(1);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();

}

}

源码下载:

参考文章:

http://www.jianshu.com/p/104be7cd72b6
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: