ViewPager不设置预加载和Fragment只加载一次

今日写了一个 ViewPager 和 Fragment 配合使用,达到 ViewPager 不设置预加载(也就是一次只加载一个)和 Fragment 懒加载(也就是只加载一次)。通俗的说就是滑动或点击哪个便加载哪个,并且加载过的不再加载。下面是效果图:

ViewPager不设置预加载和Fragment只加载一次_第1张图片

下面是下载地址:

GitHub 下载地址:https://github.com/wuqingsen/FragmentLazy

CSDN 下载地址:https://download.csdn.net/download/wuqingsen1/10808254

这里是在 Fragment 类中操作的,所以直接看 Fragment 类中的代码: 

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * author: wu
 * date: on 2018/11/26.
 * describe:Fragment懒加载和ViewPager取消预加载
 */

@SuppressLint("ValidFragment")
public class MainFragment extends Fragment {
    private View view;
    private TextView tv_text;
    private String text;
    //是否可见
    public boolean isVisible = false;
    //是否初始化完成
    public boolean isInit = false;
    //是否已经加载过
    public boolean isLoadOver = false;

    public MainFragment() {
    }

    public MainFragment(String text) {
        this.text = text;
    }

    //界面可见时再加载数据(该方法在onCreate()方法之前执行。)
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        this.isVisible = isVisibleToUser;
        setParam();
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (view == null) {
            view = View.inflate(getActivity(), R.layout.fragment_main, null);
            isInit = true;
            setParam();
        }
        return view;
    }

    /**
     * 初始化一些参数,完成懒加载和数据只加载一次的效果
     * isInit = true:此Fragment初始化完成
     * isLoadOver = false:此Fragment没有加载过
     * isVisible = true:此Fragment可见
     */
    private void setParam() {
        if (isInit && !isLoadOver && isVisible) {
            isLoadOver = true;
            setDates();
        }
    }

    /**
     * 在这里写请求网络等逻辑代码
     */
    private void setDates() {
        Log.e("=====", "加载" + text + "数据");
        tv_text = view.findViewById(R.id.tv_text);
        tv_text.setText(text);
    }
}

类中的代码也是十分的简单,重要的是理解上面的三个 boolean 类型的参数,当这三个参数条件都满足以下条件时,再去加载网络:

此 Fragment 初始化完成、此 Fragment 没有加载过并且此 Fragment 处于可见状态下加载数据。

这三个条件缺一不可。代码写完就来看打印日志,我的操作顺序是:第一页==>第三页==>第二页==>第五页==>第四页:

ViewPager不设置预加载和Fragment只加载一次_第2张图片

可以看出,达到了我们预期的效果。

你可能感兴趣的:(Fragment,Fragment探索)