原文在简书:https://www.jianshu.com/p/eb81f3692229
我的是缩减版,只有优化,可以去看原版的。
public abstract class PagerFragment extends Fragment implements View.OnClickListener{ protected View rootView; //当前Fragment是否处于可见状态标志,防止因ViewPager的缓存机制而导致回调函数的触发 private boolean isFragmentVisible; //是否是第一次开启网络加载 public boolean isFirst; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (rootView == null) rootView = inflater.inflate(getLayoutResource(), container, false); // mUnbinder = ButterKnife.bind(this, rootView); initView(rootView); //可见,但是并没有加载过 if (isFragmentVisible && !isFirst) { onFragmentVisibleChange(true); } return rootView; } //获取布局文件 protected abstract int getLayoutResource(); //初始化view protected abstract void initView(View rootView); @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { isFragmentVisible = true; } if (rootView == null) { return; } //可见,并且没有加载过 if (!isFirst&&isFragmentVisible) { onFragmentVisibleChange(true); return; } //由可见——>不可见 已经加载过 if (isFragmentVisible) { onFragmentVisibleChange(false); isFragmentVisible = false; } } @Override public void onDestroyView() { super.onDestroyView(); } /** * 当前fragment可见状态发生变化时会回调该方法 * 如果当前fragment是第一次加载,等待onCreateView后才会回调该方法,其它情况回调时机跟 {@link #setUserVisibleHint(boolean)}一致 * 在该回调方法中你可以做一些加载数据操作,甚至是控件的操作. * * @param isVisible true 不可见 -> 可见 * false 可见 -> 不可见 */ protected void onFragmentVisibleChange(boolean isVisible) { loadData();//加载数据 getclick();//点击事件 } protected abstract void getclick(); protected abstract void loadData(); }
使用就是用fragment继承,实现抽象方法,viewpager和tablayout正常执行就可以了。