extends RxFragment {
+ public V mBinding;
+ public VM mViewModel;
+ private CompositeDisposable mCompositeDisposable;
+ protected LoadDialog dialog;
+ /**
+ * Fragment是否可见状态
+ */
+ private boolean isFragmentVisible = false;
+ /**
+ * 标志位,View是否已经初始化完成。
+ */
+ private boolean isPrepared = false;
+ /**
+ * 是否第一次加载
+ */
+ private boolean isFirstLoad = true;
+
+
+ /**
+ *
+ * 忽略isFirstLoad的值,强制刷新数据,但仍要Visible & Prepared
+ * 一般用于PagerAdapter需要刷新各个子Fragment的场景
+ * 不要new 新的 PagerAdapter 而采取reset数据的方式
+ * 所以要求Fragment重新走initData方法
+ * 故使用 {@link BaseFragment#setForceLoad(boolean)}来让Fragment下次执行initData
+ *
+ */
+ private boolean forceLoad = false;
+
+
+ protected BaseActivity mActivity;
+ private void initBundle(Bundle bundle) {
+ if (mViewModel != null) {
+ mViewModel.onBundle(bundle);
+ }
+ }
+ @Override
+ public void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ }
+
+ @Override
+ public void onAttach(@NonNull Context context) {
+ super.onAttach(context);
+ mActivity= (BaseActivity) getActivity();
+ }
+
+ @Nullable
+ @Override
+ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+
+ View view=inflater.inflate(getLayoutId(inflater, container), container, false);
+
+ initViewDataBinding(view);
+ //页面间传值
+ if (savedInstanceState != null) {
+ initBundle(savedInstanceState);
+ } else if (getArguments() != null) {
+ initBundle(getArguments());
+ }
+
+ // 若 viewpager 不设置 setOffscreenPageLimit 或设置数量不够
+ // 销毁的Fragment onCreateView 每次都会执行(但实体类没有从内存销毁)
+ isFirstLoad = true;
+ loadData();
+ initView();
+ return view;
+
+ }
+ /**
+ * 绑定mViewModel
+ */
+ private void initViewDataBinding(View view) {
+ if(view==null){
+ return;
+ }
+ mBinding= DataBindingUtil.bind(view);
+ mViewModel = initViewModel();
+ if (mViewModel == null) {
+ Class modelClass;
+ Type type = getClass().getGenericSuperclass();
+ if (type instanceof ParameterizedType) {
+ modelClass = (Class) ((ParameterizedType) type).getActualTypeArguments()[1];
+ } else {
+ //如果没有指定泛型参数,则默认使用BaseViewModel
+ modelClass = BaseViewModel.class;
+ }
+ mViewModel = (VM) createViewModel(this, modelClass);
+ }
+
+ if (mViewModel != null) {
+ mBinding.setVariable(initVariableId(), mViewModel);
+ }
+
+ //页面事件监听的方法 用于ViewModel层转到View层的事件注册
+ initViewObservable();
+ registorLiveDataCallBack();
+ }
+
+
+ @Override
+ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
+ super.onViewCreated(view, savedInstanceState);
+
+ //界面初始化完成
+ isPrepared = true;
+ loadData();
+ }
+
+ /**
+ * 如果是与ViewPager一起使用,调用的是setUserVisibleHint
+ *
+ * 这个方法执行的时候onCreateView并不一定执行(切记)
+ *
+ * @param isVisibleToUser 是否显示出来了
+ */
+ @Override
+ public void setUserVisibleHint(boolean isVisibleToUser) {
+ super.setUserVisibleHint(isVisibleToUser);
+ if (getUserVisibleHint()) {
+ onVisible();
+ } else {
+ onInvisible();
+ }
+ }
+
+ /**
+ * 如果是通过FragmentTransaction的show和hide的方法来控制显示,调用的是onHiddenChanged.
+ * 若是初始就show的Fragment 为了触发该事件 需要先hide再show
+ *
+ * @param hidden hidden True if the fragment is now hidden, false if it is not
+ * visible.
+ */
+ @Override
+ public void onHiddenChanged(boolean hidden) {
+ super.onHiddenChanged(hidden);
+ if (!hidden) {
+ onVisible();
+ } else {
+ onInvisible();
+ }
+ }
+
+ public void onInvisible() {
+ isFragmentVisible = false;
+ }
+
+ /**
+ * 当界面可见的时候执行
+ */
+ public void onVisible() {
+ isFragmentVisible = true;
+ loadData();
+
+ }
+
+
+ /**
+ * 这里执行懒加载的逻辑
+ * 只会执行一次(如果不想只执行一次此方法): {@link BaseFragment#setForceLoad(boolean)}
+ */
+ public void lazyLoad() {
+ Log.d("BaseMVVMFragment","BaseMVVMFragment: lazyLoad");
+ }
+
+ private void loadData() {
+ //判断View是否已经初始化完成 并且 fragment是可见 并且是第一次加载
+ if (isPrepared && isFragmentVisible && isFirstLoad) {
+ if (forceLoad || isFirstLoad) {
+ forceLoad = false;
+ isFirstLoad = false;
+ lazyLoad();
+ }
+ }
+ }
+
+ /**
+ * @param forceLoad 设置为true lazyLoad()方法会执行多次 否则只会执行一次
+ */
+ public void setForceLoad(boolean forceLoad) {
+ this.forceLoad = forceLoad;
+ }
+
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ //防止空指针异常
+ if (mViewModel != null) {
+// mViewModel.removeRxBus();
+// mViewModel.onDestroy();
+ mViewModel = null;
+ }
+ if (mBinding != null) {
+ mBinding.unbind();
+ }
+ isPrepared = false;
+ unsubscribe();
+ }
+
+ /**
+ * 初始化布局的id
+ *
+ * @return 布局的id
+ */
+ protected abstract int getLayoutId(LayoutInflater inflater, @Nullable ViewGroup container);
+
+ /**
+ * 初始化ViewModel
+ *
+ * @return 继承BaseViewModel的ViewModel
+ */
+ public VM initViewModel(){
+ return null;
+ }
+ /**
+ * 初始化ViewModel的id
+ *
+ * @return BR的id
+ */
+ // protected abstract int initVariableId();
+
+ /**
+ * 布局文件里的ViewModel默命名为viewModel(命名为其它重写方法返回自定义的命名)
+ */
+ public int initVariableId() {
+ return com.example.baseframe.BR.viewModel;
+ }
+
+
+ public abstract void initViewObservable();
+ /**
+ * 初始化view
+ */
+ protected abstract void initView();
+
+ /**
+ * 创建ViewModel
+ */
+ public T createViewModel(Fragment fragment, Class cls) {
+ return ViewModelProviders.of(fragment).get(cls);
+ }
+
+
+ /**
+ * 添加activity里的订阅者 对订阅者统一管理,避免内存泄漏
+ *
+ * @param disposable
+ */
+ public void addRxDisposable(Disposable disposable) {
+ if (mCompositeDisposable == null) {
+ mCompositeDisposable = new CompositeDisposable();
+ }
+ mCompositeDisposable.add(disposable);
+ }
+
+ /**
+ * 解绑
+ */
+ public void unsubscribe() {
+ if (this.mCompositeDisposable != null) {
+ mCompositeDisposable.dispose();
+ this.mCompositeDisposable.clear();
+ mCompositeDisposable = null;
+ }
+ }
+
+
+
+ /**
+ * 注册(初始化)ViewModel与View的UI回调事件
+ */
+ protected void registorLiveDataCallBack() {
+ //加载对话框显示
+ mViewModel.getUILiveData().getShowDialogEvent().observe(this,s -> showDialog(s));
+ //加载对话框消失
+ mViewModel.getUILiveData().getDismissDialogEvent().observe(this,aVoid ->dismissDialog());
+ //跳入新页面
+ mViewModel.getUILiveData().getStartActivityEvent().observe(this, new Observer