ViewPager懒加载的那些事

不怕跌倒,所以飞翔

今天在公司写项目的时候用到了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()这里如果要是已经准备好的话,就可以加载数据了,如果没有准备好就不去加载数据!这里面的注释写的很清楚了,仔细回味一下就好了,其实主要是理解上面那那个方法的话就好了。。。

你可能感兴趣的:(ViewPager懒加载的那些事)