概述
ViewPager 会对添加到它里面的 Fragment ,在默认情况下会对相邻的一个Fragment 进行预加载,我们可以通过设置 setOffscreenPageLimit
方法控制加载的 Fragment 个数。
但是很多时候,我们不想一下子加载那么多 Fragment,所以我们需要在 Fragment 中做一些处理。
懒加载 Fragment
每个 Fragment 的界面在获取数据前做一些判断,具体代码如下所示
在 MyFragment 中
...
// 懒加载
private boolean isInit = false; // 是否已经初始化
private boolean isLoad = false; // 是否已经加载完数据
// Fragmengt 界面每次显示或隐藏都会调用这个方法
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
canLoadData();
Log.i("view", "MyFragment---setUserVisibleHint()方法" + isVisibleToUser);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_layout, container, false);
isInit = true;
recyclerView = view.findViewById(R.id.my_rv);
adapter = new MyAdapter(getContext(), datas);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
registerForContextMenu(recyclerView);
recyclerView.setAdapter(adapter);
canLoadData();
return view;
}
// 判断是否进行数据加载
private void canLoadData() {
if (!isInit) {
Log.i("lazy", "MyFragment视图还没初始化");
return;
}
if (getUserVisibleHint()) {
if (isLoad) {
Log.i("lazy", "MyFragment视图已经初始化,数据已经加载");
return;
}
lazyLoad();
isLoad = true;
}
}
// 加载数据
private void lazyLoad() {
Log.i("lazy", "MyFragment视图初始化,加载数据");
String[] array = getResources().getStringArray(R.array.array);
for (int i = 0; i < array.length; i++) {
datas.add(i,array[i]);
}
adapter.notifyDataSetChanged();
}
...
ViewPager 的第一个 Fragment - MyFragment显示日志
08-22 15:50:54.044 24389-24389/com.example.zhanghuabin.testcontextmenu I/lazy: MyFragment视图还没初始化
08-22 15:50:54.044 24389-24389/com.example.zhanghuabin.testcontextmenu I/lazy: MyFragment1视图还没初始化
08-22 15:50:54.044 24389-24389/com.example.zhanghuabin.testcontextmenu I/lazy: MyFragment视图还没初始化
08-22 15:50:54.044 24389-24389/com.example.zhanghuabin.testcontextmenu I/lazy: MyFragment视图还没初始化
08-22 15:50:54.054 24389-24389/com.example.zhanghuabin.testcontextmenu I/lazy: MyFragment视图初始化,加载数据
ViewPager 的第二个 Fragment - MyFragment1显示日志
08-22 15:52:40.854 24389-24389/com.example.zhanghuabin.testcontextmenu I/lazy: MyFragment1视图初始化,加载数据
ViewPager 的第三个 Fragment - MyFragment显示日志
08-22 15:53:15.834 24389-24389/com.example.zhanghuabin.testcontextmenu I/lazy: MyFragment视图初始化,加载数据
其实就是在 Fragment 加载数据的时候,做了getUserVisibleHint
方法判断当前 Fragment 的现实状态。isInit
变量主要是控制 Fragment 在 onCreateView
方法还没有调用之前对数据进行加载并设置,由于 setUserVisibleHint
方法会在 onCreateView 方法之前会调用,防止出现空指针异常。isLoad
变量是控制如果数据已经加载了一遍就不让再加载了。