欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ViewPager懒加载的那些事

程序员文章站 2022-05-07 12:43:39
...

不怕跌倒,所以飞翔

今天在公司写项目的时候用到了Fragment的懒加载,发现懒加载的细节还有些不理解的,所以准备写一篇文章记录一下今天用到项目中用到的内容总结一下:

关于ViewPager懒加载,必须要先说说ViewPager的加载方法:

ViewPager预加载机制

在Android中我们经常会用到ViewPager+Fragment组合。然而,有一个很让人头疼的问题就是,我们去加载数据的时候由于ViewPager的内部机制所限制,所以它会默认至少预加载一个。这让人很郁闷,所以,我就想到要封装一个Fragment来解决这个问题。

关于懒加载主要的两个方法就是

void setUserVisibleHint(boolean isVisibleToUser);//代表Fragment可见的时候回调的方法
boolean getUserVisibleHint();//获取当前Fragment是否可见的方法

通过上面两个方法对数据的加载进行判断,从而达到懒加载的目的。

具体的实现方案就是,在页面可见的时候(也就是setUserVisibleHint()回调的时候对数据进行判断,是否加载数据,其实这个时候控件已经加载出来了,只是数据没有进行请求和加载)加载数据。

public abstract class BaseFragment extends Fragment {

    public Context mContext;
    protected boolean isVisible = false;/*是否可见*/
    protected boolean isPrepared = false;/*是否已经准备好*/
    protected boolean isFirst = true;/*是否第一次加载*/

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (getUserVisibleHint()) {
            isVisible = true;
            lazyLoad();
        } else {
            isVisible = false;
            onInvisible();
        }
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = getContext();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(createViewLayoutId(), container, false);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        isPrepared = true;/*数据已经准备好了*/
        initPrepare();
    }

    /**
     * 设置资源ID的方法
     *
     * @return 返回相应的资源ID
     */
    public abstract int createViewLayoutId();

    /**
     * 是否已经准备好数据
     */
    protected abstract void initPrepare();

    /**
     * 不可见的时候调用,也就是每次页面不可见的时候都会调用这个方法
     */
    protected abstract void onInvisible();

    protected void lazyLoad() {
        /*这里isFirst可以根据实际情况去判断这个是否需要,是否需要每次进到这个页面需要刷新*/
        if (!isPrepared || !isVisible /*|| !isFirst*/) {
            return;
        }
        initData();
//        isFirst = false;
    }

    /**
     * 这里获取数据,刷新界面
     */
    protected abstract void initData();
}

上面这个主要是实现懒加载的Fragment,这里主要看setUserVisibleHint(boolean isVisibleToUser)这个方法,这里面主要是判断当页面显示的时候设为可见,并且进入lazyLoad()这里如果要是已经准备好的话,就可以加载数据了,如果没有准备好就不去加载数据!这里面的注释写的很清楚了,仔细回味一下就好了,其实主要是理解上面那那个方法的话就好了。。。