在大部分安卓APP开发中都会用到ViewPager和Fragment的结合使用,而ViewPager又会出现预加载的情况,比如说打开app时第一个fragment和第二个fragment已经加载好了,当滑动到第二个fragment的时候第三个fragment已经加载好了,我们大多时候都希望当滑动到哪一页就加载哪一页,这样性能比较好也比较省流量,因此需要一个方法来解决这个问题。

BaseFragment中

import android.support.v4.app.Fragment;

/**
 * Created by AZ001 on 2017/7/6.
 */

public class BaseFragment extends Fragment {

    protected boolean mIsVisible = false;

    /**
     * 在这里实现懒加载.
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (getUserVisibleHint()) {
            mIsVisible = true;
            onVisible();
        } else {
            mIsVisible = false;
            onInvisible();
        }
    }

    protected void onInvisible() {
    }

    /**
     * 显示时加载数据,需要这样的使用
     * 注意声明 isPrepared,先初始化
     * 生命周期会先执行 setUserVisibleHint 再执行onActivityCreated
     * 在 onActivityCreated 之后第一次显示加载数据,只加载一次
     */
    protected void loadData() {
    }

    protected void onVisible() {
        loadData();
    }
}



在setUserVisibleHint中判断当前界面是否展示在用户面前,如果是那么执行onVisible()方法,否则执行onInvisible()方法


FirstPageFragment

import android.os.Bundle;
import android.support.annotation.Nullable;

/**
 * Created by AZ001 on 2017/7/6.
 */

public class FirstPageFragment extends BaseFragment {

    private boolean isPrepared = false;
    private boolean isFirst = true;


    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        isPrepared = true;
        //loadData的执行比onActivityCreated快,所以要保证onActivityCreated执行过,再去执行loadData方法,初始化完成后才能执行loadData方法
        //比如当打开有4个fragment的界面的时候,第一个fragment执行了loadData方法但是还没有初始化,所以不能执行isParepared为false,
        //然后第一个界面和第二个界面的onActivityCreated已经先执行了,(这里setOffscreenPageLimit方法设置的数量为默认的)此时isPrepared为true。
        //然后需要手动的去执行loadData方法(因为loadData已经执行了一次之前)。当切换到第二个界面的时候,由于onActivityCreated已经执行过了,初始化已经做好了,那么
        //BaseFragment 中的onVisible方法会执行,随后子Fragment中的loadData方法执行了,就不会出现第一个界面打开时的情况
        loadData();
    }

    @Override
    protected void loadData() {
        //只有当fragment显示了 初始化完成了 第一次进入界面的时候才能进行数据请求
        if (!mIsVisible || !isPrepared || !isFirst) {
            return;
        }
        //其他操作
    }
}



SecondPageFragment

import android.os.Bundle;
import android.support.annotation.Nullable;

/**
 * Created by AZ001 on 2017/7/6.
 */

public class SecondPageFragment extends BaseFragment {

    private boolean isPrepared = false;
    private boolean isFirst = true;


    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        isPrepared = true;
        //viewpager的预加载会先执行此方法
    }

    @Override
    protected void loadData() {
        //只有当fragment显示了 初始化完成了 第一次进入界面的时候才能进行数据请求
        if (!mIsVisible || !isPrepared || !isFirst) {
            return;
        }
        //其他操作
    }
}



在loadData方法中去请求数据,同时要判断是否展示当前界面,是否已经初始化了,是否已经执行过请求不用每次显示界面都去请求数据。