Fragment懒加载

所谓懒加载,即用户切到对应的fragment时才加载数据(Android默认加载可见fragment和可见fragment的左右fragment即3个fragment数据,这样可能会导致界面产生卡顿)

如何判断fragment是否可见

Fragmet提供了一个setUserVisibleHint方法里有个isVisibleToUser参数如果为True则为可见否则为不可见:

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser ) {
            //可见
        }else{
            //不可见
        }
    }

setUserVisibleHint 在什么时候调用?

对于单个 Fragment,setUserVisibleHint 是不会被调用的,只有该 Fragment 在 ViewPager 里才会被调用。而setUserVisibleHint在fragment的生命周期调用顺序如下

-> setUserVisibleHint(false) 
-> onAttach
-> onCreate 
-> setUserVisibleHint(true)  
-> onCreateView 
-> onActivityCreated 
-> .... 
-> onDetach

LazyFragment

了解了原理,现在改写Fragment,增加loadData方法来进行数据加载

/**
 * Created by JokAr on 16/8/10.
 */
public abstract class LazyFragment extends Fragment {
    //控件是否已经初始化
    private boolean isCreateView = false;
    //是否已经加载过数据
    public boolean isLoadData = false;

    /**
     * 返回layoutView
     * @param inflater
     * @param container
     * @return
     */
    public abstract View getView(LayoutInflater inflater, ViewGroup container);

    /**
     * 初始化控件
     */
    public abstract void initViews(View view);

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = getView(inflater, container);
        initViews(view);
        isCreateView = true;
        return view;
    }


    //此方法在控件初始化前调用,所以不能在此方法中直接操作控件会出现空指针
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser && isCreateView && !isLoadData) {
            loadData();
        }
    }


    /**
     * 加载数据
     */
    public void loadData() {
        //如果没有加载过就加载,否则就不再加载了
        if (!isLoadData) {
            //加载数据操作
            isLoadData = true;
        }
    }


    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //第一个加载fragment会调用
        if (getUserVisibleHint())
            loadData();
    }


}

这样就完成了,

  • getView 返回fragment的layout,
  • initViews 初始化控件,
  • loadData 加载数据

注意viewPager不保存Fragment问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值