Android中ViewPage+Fragment的预加载的取消

在最近的项目中,用到ViewPager+Fragment,但是Fragment有个不好或者太好的地方。例如你在ViewPager中添加了三个Fragment,当加载ViewPager中第一个Fragment时,它会默认帮你预先加载了第二个Fragment,当你加载第二个Fragment时,它会帮你加载第三个Fragment。这样虽然有时很好,但是用户只需看一个Fragment时,我们就做了一些多余工作加载了第二个Fragment。在这只需要取消Fragment的预加载即可,只有当用户切换到某个Fragment才加载.
这里写图片描述

实际问题就是这个,第一个页面有”暂停”按钮,点击暂停,该职位就到”已暂停职位”列表,然而进入该模块的时候,前两个fragment已经加载,所以,点”暂停”之后,到第二个页面,需要下拉刷新才会出现该职位

在BaseFragment.java中

protected boolean isVisible;
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        // TODO Auto-generated method stub
        super.setUserVisibleHint(isVisibleToUser);
         if(getUserVisibleHint()) {
                isVisible = true;
                onVisible();
            } else {
                isVisible = false;
                onInvisible();
            }
    }
     /**
     * 可见
     */
    protected void onVisible() {
        lazyLoad();     
    }


    /**
     * 不可见
     */
    protected void onInvisible() {


    }


    /** 
     * 延迟加载
     * 子类必须重写此方法
     */
    protected void lazyLoad() {
    }

注意:setUserVisibleHint在每次fragment显示与隐藏都会调用,他的调用顺序在onCreateView前面,所以需要一些常量进行判断

“发布中的职位”页面

public class JobManageFra_on extends  BaseFragment{

    private RefreshListView lv;
    ArrayList<JobManagerBean> lists=new ArrayList<JobManagerBean>();
    GsonDataBean gsonBean=null;
    ArrayList<JobManagerBean>  list=new ArrayList<JobManagerBean>();
    JobManagerBean bean;
    String companyId="";
    View view;
    RelativeLayout loading;
    boolean isPrepared=false;//判定view是否inflater
    int i=0;
    @Override       
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        if(!ProjectUtils.checkNetworkState()){
            view=ProjectUtils.inflate(R.layout.loading_page_nonet);
            //设置网络
            setNet();           
        }else{
            if(null==view){
view=inflater.inflate(R.layout.fragment_job_manage_frag_on, container, false);
            init();
            initListener(); 
            **requeServer();**
            }
            ViewGroup parent = (ViewGroup) view.getParent();
            if (parent != null) {
                parent.removeView(view);
            }}
        isPrepared=true;
        return view;
    }
    @Override
    protected void lazyLoad() {
        super.lazyLoad();
        **if(!isVisible) {**
            return;
        }
         pd = ProgressDialog.show(getActivity(), null,
                    "正在加载,请稍候...");     
        requeServer();
    }

“已暂停的职位”页面

public class JobManageFra_pause extends  BaseFragment{

    private RefreshListView lv;
    GsonDataBean gsonBean=null;
    ArrayList<JobManagerBean>  list=new ArrayList<JobManagerBean>();
    ArrayList<JobManagerBean>  lists=new ArrayList<JobManagerBean>();
    JobManagerBean bean;
    String companyId="";
    View view;
    boolean isPrepared=false;//判定view是否inflater
    @Override       
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        if(!ProjectUtils.checkNetworkState()){
            view=ProjectUtils.inflate(R.layout.loading_page_nonet);
            //设置网络
            setNet();           
        }else{
            if(view==null){
         view=inflater.inflate(R.layout.fragment_job_manage_frag_pause, container, false);
         init();
        initListener(view);
        }
            ViewGroup parent = (ViewGroup) view.getParent();
            if (parent != null) {
                parent.removeView(view);
            }}
        isPrepared=true;
        return view;
    }

    @Override
    protected void lazyLoad() {
        super.lazyLoad();
        if(!isPrepared || !isVisible) {
            return;
        }
         pd = ProgressDialog.show(getActivity(), null,
                    "正在加载,请稍候...");     
        requeServer();//访问网络请求数据
    }

这里需要设置viewPager预加载几个页面,想要到一个页面再获取数据,参数就写0或1,0默认为1

viewPager.setOffscreenPageLimit(1);

setUserVisibleHint优于onCreate调用,所以当onCreate调用完毕setUserVisibleHint就不会触发
所以”发布中的职位”是第一页,进入时先执行lazyLoad()方法,但是view没有inflater,有数据显示的也是空白页,我只能在第一次进入多请求一次数据

网上有方法解决这个问题,但我这边试了一下,不行,所以用这种笨办法
这是防止预加载,进入第一个fragment解决办法
http://www.cnblogs.com/lee0oo0/p/3713391.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值