19_ViewPager 中 fragment 预加载处理

概述


ViewPager 会对添加到它里面的 Fragment ,在默认情况下会对相邻的一个Fragment 进行预加载,我们可以通过设置 setOffscreenPageLimit 方法控制加载的 Fragment 个数。

但是很多时候,我们不想一下子加载那么多 Fragment,所以我们需要在 Fragment 中做一些处理。

懒加载 Fragment


每个 Fragment 的界面在获取数据前做一些判断,具体代码如下所示

19_ViewPager 中 fragment 预加载处理_第1张图片
示意图
在 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变量是控制如果数据已经加载了一遍就不让再加载了。

参考文章
Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案

你可能感兴趣的:(19_ViewPager 中 fragment 预加载处理)