2 qq 30518099 qq_30518099 于 2016.02.18 14:04 提问

andorid viewPager +fragmen实现滑动多个界面,每个界面都有数据请求 2C

andorid viewPager +fragmen实现滑动多个界面,每个界面都有数据请求,但是我想让每个fragment仅第一次加载的时候请求数据,以后再滑动到这个fragment的时候都不在请求数据了(想请求可以下拉刷新),请问怎么实现?

4个回答

bdmh
bdmh   Ds   Rxr 2016.02.18 14:19

viewpager有个setOffscreenPageLimit方法,设置缓存页面数量,你有多少个fragment就设置多少,这样fragment只创建一次,不会中途被销毁

qq_30518099
qq_30518099 这样要是用户只查看第一个界面不滑动的话,而其他的界面已经预加载了,不是很浪费资源吗
2 年多之前 回复
Mr_dsw
Mr_dsw   Ds   Rxr 2016.02.18 22:25

通过fragment的生命周期进行判断,结合一些变量

luochoudan
luochoudan   Ds   Rxr 2016.02.19 19:14

可以从fragment出下手,考虑考虑,切换时将之前的fragment隐藏,不销毁,试试能不能合要求。

JJ_222
JJ_222   2018.05.24 17:10
 public abstract class BaseFragment extends Fragment {

    protected Context mContext;
    protected Activity mActivity;
    protected LayoutInflater mInflater;

    /**
     * 标志位,标志已经初始化完成
     */
    protected boolean isPrepared;
    private View rootView;


    public BaseFragment() {
    }


    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.mActivity = getActivity();
        this.mContext = context;
        this.mInflater = LayoutInflater.from(mActivity);
    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(setContentViewId(), container, false);

        isPrepared = true;
        return rootView;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        initViews();
        if (isFirstVisible && getUserVisibleHint()) {
            onFirstVisible();
            isFirstVisible = false;
            onVisible();
        }
    }


    //========================懒加载=========================
    /**
     * Fragment当前状态是否可见
     */
    private boolean isFirstVisible = true;
    private boolean isFirstInvisible = true;

    //调用早于 onCreate();  所以 判断是否已创建 view
    //setUserVisibleHint()在Fragment创建时会先被调用一次,传入isVisibleToUser = false
    //如果当前Fragment可见,那么setUserVisibleHint()会再次被调用一次,传入isVisibleToUser = true
    //如果Fragment从可见->不可见,那么setUserVisibleHint()也会被调用,传入isVisibleToUser = false
    //总结:setUserVisibleHint()除了Fragment的可见状态发生变化时会被回调外,在new Fragment()时也会被回调
//    这个方法仅仅工作在与viewpaer 配合使用的 Adapter中
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser && isPrepared) {
            if (isFirstVisible) {
                onFirstVisible();
                isFirstVisible = false;
            }
            onVisible();
        }
        if (!isVisibleToUser && isPrepared) {
            onInvisible();
        }
    }


    /**
     * 第一次可见,并且以初始化完成
     */
    protected void onFirstVisible() {

    }

    /**
     * 可见,并且已初始化完成
     */
    protected void onVisible() {

    }

    public boolean isFirstVisible() {

        return isFirstVisible;
    }

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

    }


    /**
     * 初始化布局
     */
    protected abstract int setContentViewId();

    /**
     * 初始化参数
     */
    protected abstract void initViews();


}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!