fragment 懒加载机制

本文详细解析了Fragment的生命周期方法,特别是setUserVisibleHint()的作用及如何结合ViewPager使用。提供了BaseFragment抽象类示例,展示了如何实现懒加载数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.首先要熟悉fragment的生命周期


如上图所示  当onattach调用时  fragment与activity发生绑定  如果此时你设置的

setOffscreenPageLimit()小于加入的fragment 后期会调用ondestroyView()方法

setUserVisibleHint()是先于任何fragment的生命周期的 并且会调用每个fragment的此方法 知道某个fragment显示后为true

当和viewpager绑定之后  会提前调用各个fragment的onattch oncraete oncraeteView onviewcreated等生命周期方法 

附上basefragment代码

也就是第一次进来的时候 通过onviewcrated去加载数据  后面tab切换的时候都是通过setUserVisibleHint()来加载数据

public abstract class BaseFragment extends android.support.v4.app.Fragment {
    private Unbinder unbinder;
    private View mContextView = null;
    protected final String TAG = "BaseFragment";

    protected boolean mIsVisible;
    protected boolean mHasLoaded;
    protected boolean mHasPrepare;
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        LogUtils.d(TAG, "onCreate");
        super.onCreate(savedInstanceState);
//        realm = Realm.getDefaultInstance();
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        LogUtils.d(TAG, "onAttach");
    }

    @Override
    public void onStart() {
        super.onStart();
        LogUtils.d(TAG, "onStart");
    }

    @Override
    public void onResume() {
        super.onResume();
        LogUtils.d(TAG, "onResume");
    }

    @Override
    public void onPause() {
        super.onPause();
        LogUtils.d(TAG, "onPause");
    }

    @Override
    public void onStop() {
        super.onStop();
        LogUtils.d(TAG, "onStop");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle
            savedInstanceState) {
        LogUtils.d(TAG, "onCreateView");

        mContextView = inflater.inflate(bindLayout(), container, false);
        unbinder = ButterKnife.bind(this, mContextView);
        initViews(mContextView);

        return mContextView;
    }
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
//        LogUtils.d(TAG, "setUserVisibleHint: " + isVisibleToUser);
        mIsVisible = getUserVisibleHint();
        lazyLoad();
    }
    protected void lazyLoad() {
//        LogUtils.d(TAG, "lazyLoad: mIsVisible " + mIsVisible + " mHasLoaded " + mHasLoaded + " mHasPrepare " + mHasPrepare);
        if (!mIsVisible || mHasLoaded || !mHasPrepare) {
            return;
        }
//        LogUtils.d(TAG, "lazyLoad: load data in lazyLoad ");
        loadData();
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

        super.onViewCreated(view, savedInstanceState);
        LogUtils.d(TAG, "onViewCreated ");
        if (mIsVisible) {
            LogUtils.d(TAG, "onViewCreated: load data in #onViewCreated ");
            loadData();

        }
        mHasPrepare = true;
    }
    protected abstract int bindLayout();

    protected abstract void initViews(View mContextView);


    @Override
    public void onDetach() {
        super.onDetach();
        LogUtils.d(TAG, "onDetach");
    }

    @Override
    public void onDestroy() {
        LogUtils.d(TAG, "onDestroy");
        super.onDestroy();
        mHasLoaded = false;
        mHasPrepare = false;
        unbinder.unbind();
//        realm.close();
    }


    public   void loadData(){
// LogUtils.d(TAG ,"-----loadData-----");
    }

    @Override
    public void onDestroyView() {
        LogUtils.d(TAG, "onDestroyView");
        super.onDestroyView();

    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值