今日写了一个 ViewPager 和 Fragment 配合使用,达到 ViewPager 不设置预加载(也就是一次只加载一个)和 Fragment 懒加载(也就是只加载一次)。通俗的说就是滑动或点击哪个便加载哪个,并且加载过的不再加载。下面是效果图:
下面是下载地址:
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 处于可见状态下加载数据。
这三个条件缺一不可。代码写完就来看打印日志,我的操作顺序是:第一页==>第三页==>第二页==>第五页==>第四页:
可以看出,达到了我们预期的效果。