实现类似微信的延迟加载的Fragment——LazyFragment

参考微信,使用ViewPager来显示不同的tab,每个tab是一个Fragment,

假设有3个tab,对应的fragment是FragmentA、FragmentB、FragmentC

需要实现的效果是进入后,默认先只加载FragmentA,具体滑动到了哪个Fragment,再去加载该Fragment的数据。

可以参考如下BaseLazyFragment代码:

/**
 * Author: wangjie
 * Email: tiantian.china.2@gmail.com
 * Date: 1/23/15.
 */
public class BaseLazyFragment extends BaseFragment {
    private static final String TAG = BaseLazyFragment.class.getSimpleName();
    private boolean isPrepared;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initPrepare();
    }


    /**
     * 第一次onResume中的调用onUserVisible避免操作与onFirstUserVisible操作重复
     */
    private boolean isFirstResume = true;

    @Override
    public void onResume() {
        super.onResume();
        if (isFirstResume) {
            isFirstResume = false;
            return;
        }
        if (getUserVisibleHint()) {
            onUserVisible();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if (getUserVisibleHint()) {
            onUserInvisible();
        }
    }

    private boolean isFirstVisible = true;
    private boolean isFirstInvisible = true;

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            if (isFirstVisible) {
                isFirstVisible = false;
                initPrepare();
            } else {
                onUserVisible();
            }
        } else {
            if (isFirstInvisible) {
                isFirstInvisible = false;
                onFirstUserInvisible();
            } else {
                onUserInvisible();
            }
        }
    }

    public synchronized void initPrepare() {
        if (isPrepared) {
            onFirstUserVisible();
        } else {
            isPrepared = true;
        }
    }

    /**
     * 第一次fragment可见(进行初始化工作)
     */
    public void onFirstUserVisible() {

    }

    /**
     * fragment可见(切换回来或者onResume)
     */
    public void onUserVisible() {

    }

    /**
     * 第一次fragment不可见(不建议在此处理事件)
     */
    public void onFirstUserInvisible() {

    }

    /**
     * fragment不可见(切换掉或者onPause)
     */
    public void onUserInvisible() {

    }

}

如上代码,使用setUserVisibleHint方法作为回调的依据,

暴露出来让子类使用的新的生命周期方法为:

- onFirstUserVisible();

第一次fragment可见(进行初始化工作)

- onUserVisible(); 

fragment可见(切换回来或者onResume)

- onFirstUserInvisible();

第一次fragment不可见(不建议在此处理事件)

- onUserInvisible();

fragment不可见(切换掉或者onPause)

 

具体的效果是:

1. 首先加载ViewPager,回调FragmentA(第一个默认呈现的Fragment)的onFirstUserVisible(),可以在这里进行FragmentA的初始化工作,其他Fragment保持不变。

2. 用户从FragmentA滑动到FragmentB,回调FragmentA的onUserInvisible()、FragmentB的onFirstUserVisible()(因为第一次切换到FragmentB,可以在这里进行初始化工作)。

3. 用户从FragmentB滑动到FragmentC,回调FragmentB的onUserInvisible()、FragmentC的onFirstUserVisible()(因为第一次切换到FragmentC,可以在这里进行初始化工作)。

4. 用户从FragmentC滑动到FragmentB,回调FragmentC的onUserInvisible()、FragmentB的onUserVisible()(因为FragmentB之前已经被加载过)。

5. 因为到此为止,suoyou的Fragment都已经被加载过了,所以以后这3个Fragment互相任意切换,只会回调原来Fragment的onUserInvisible()和切换后的Fragment的onUserVisible()。

6. 用户处于FragmentB,关闭手机屏幕,回调FragmentB的onUserInvisible()。

7. 用户处于FragmentB,手机屏幕处关闭状态,然后开启手机屏幕解锁,只回调FragmentB的onUserVisible()。

 

posted @ 2015-08-10 17:49  星辰之力  阅读(1671)  评论(0编辑  收藏  举报