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

来源:互联网 发布:药物制剂论文数据统计 编辑:程序博客网 时间:2024/06/05 23:03
关于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




原创粉丝点击