项目中常碰到的点击到某Fragment才开始加载该Fragment的数据的一小解决方案

   前言:项目中经常会碰到底部几个tab标签,然后中间一块是内容,一般都是fragment+RadioButton来实现该需求,但是,众所周知,附近相邻的fragment会同时触发,至于缘由呢,百度上面可以找到。下面只分享我的个人的解决方案,但是**注意的是,该解决方案没涉及到fragment的嵌套,没涉及到屏幕横竖屏切换fragment的销毁**。

一般的fragment+RadioButton的解决方案:

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        if (view == null) {
            view = inflater.inflate(R.layout.fragment_info, container, false);

            initToolbar();
            init(view);
            isPrepared = true;
        }
        ViewGroup parent = (ViewGroup) view.getParent();
        if (parent != null) {
            parent.removeView(view);
        }
        initValue();
        ButterKnife.bind(this, view);
        return view;
    }

上面是初始化View,判断parent是否为空的缘由也请自行百度。

其实最主要的方法如下:

    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (!isPrepared) {
            return;
        }

        if (!hidden && this.isAdded()) {
            LogUtil.e(TAG, "onHiddenChanged----");
            loadData();
        }
    }
    @Override
    public void onResume() {
        super.onResume();
        if (!this.isHidden() && this.isAdded() && !isFromActivityResultRefresh) {
            LogUtil.e(TAG, "onResume----");
            loadData();
        }
    }

有很多人都在用懒加载并且还重写了setUserVisibleHint方法,其实我打印了一下,感觉实现不了,setUserVisibleHint方法配合能切换的fragment才有效果,例如tabLayout+fragment,或者viewpager+fragment才起作用。so,下面附上tabLayout+fragment实现滑动到某fragment,该fragment才加载数据的个人解决方案:

public abstract class LazyFragment extends BaseFragment {

    /**
     * Fragment当前状态是否可见
     */
    protected boolean isVisible;

    /**
     * 在这里实现Fragment数据的缓加载(该方法搭配ViewPager才能生效).
     * @param isVisibleToUser
     */
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (getUserVisibleHint()) {
            isVisible = true;
            onVisible();
        } else {
            isVisible = false;
            onInvisible();
        }
    }

    /**
     * 可见
     */
    protected void onVisible() {
        lazyLoad();
    }

    protected abstract void lazyLoad();

    /**
     * 不可见
     */
    protected void onInvisible() {
    }
}

上面的代码忘了是哪位仁兄写的了,先感谢他。另外,每个fragment的onCreateView中的初始化也跟上面代码一致。最后附上重头戏:

    @Override
    protected void lazyLoad() {
        if (!isPrepared || !isVisible) {
            return;
        }
        //填充各控件的数据
        loadData();
        LogUtil.e(TAG, "lazyLoad----" + isVisible);
    }
    @Override
    public void onResume() {
        super.onResume();
        if (isVisible && this.isAdded() && !isFromActivityResultRefresh) {
            LogUtil.e(TAG, "onResume----");
            loadData();
        }
    }

嗯,主要实现方法就是上面那些了。下面附上demo下载链接:fragment+RadioButton
TabLayout+fragment

你可能感兴趣的:(android开发)