自带Databinding和ViewModel的基础Activity

通过继承下面的类就可以初始化databinding和AndroidViewModel,省去重复的工作

public abstract class BaseInflateActivity<VM extends AndroidViewModel, VDB extends ViewDataBinding> extends AppCompatActivity {
    protected VDB mBinding;
    protected VM mViewModel;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mBinding = ViewDataBindingHelper.inflateVDB(this);
        setContentView(mBinding.getRoot());
        mBinding.setLifecycleOwner(this);
        mViewModel=ViewModelHelper.createAndroidViewModel(this.getClass(),this);
    }

    public VDB getBinding() {
        return mBinding;
    }

    public VM getViewModel() {
        return mViewModel;
    }
}

ViewDataBindingHelper类

public class ViewDataBindingHelper {

    /**
     * 生成ViewDataBinding
     * @param context
     * @param <VDB>
     * @return
     */
    public static <VDB extends ViewDataBinding> VDB inflateVDB(Context context) {
        Class modelClass = getViewDataBindingModelClass(context.getClass());
        if (modelClass != null) {
            Method inflate = null;
            try {
                inflate = modelClass.getDeclaredMethod("inflate", LayoutInflater.class);
                return (VDB) inflate.invoke(null, LayoutInflater.from(context));

            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 获取ViewDataBinding的具体类
     * @param clazz
     * @return
     */
    private static Class getViewDataBindingModelClass(Class clazz) {
        Class modelClass = null;
        Type type = clazz.getGenericSuperclass();
        if (type == null)
            return null;
        if (type instanceof ParameterizedType) {
            ParameterizedType tmpType = (ParameterizedType) type;
            for (Type t : tmpType.getActualTypeArguments()) {
                if (instanceOfViewDataBinding((Class) t))
                    modelClass = (Class) t;
            }
            if (modelClass == null)
                modelClass = getViewDataBindingModelClass(clazz.getSuperclass());
        } else {
            modelClass = getViewDataBindingModelClass(clazz.getSuperclass());
        }
        return modelClass;
    }

    /**
     * 判断一个类是否继承ViewDataBinding
     * @param clazz
     * @return
     */
    private static boolean instanceOfViewDataBinding(Class clazz) {
        if (clazz == null)
            return false;
        if (!ViewDataBinding.class.isAssignableFrom(clazz))
            return instanceOfViewDataBinding(clazz.getSuperclass());
        else
            return true;
    }
}

ViewModelHelper类

这里需要传入ViewModelStoreOwner这个参数,由于Acitivity继承了AppCompatActivity,而它实现了这个接口,直接传入即可。

public class ViewModelHelper {

    /**
     * 生成ViewModel
     * @param context 
     * @param owner
     * @param <VM>
     * @return
     */
    public static <VM extends ViewModel> VM createAndroidViewModel(Context context, ViewModelStoreOwner owner) {
        Class modelClass = getViewModelClass(context.getClass());
        return (VM) new ViewModelProvider(owner).get(modelClass);

    }

    /**
     * 获取ViewModel具体类
     * @param clazz
     * @return
     */
    private static Class getViewModelClass(Class clazz) {
        Class modelClass = null;
        Type type = clazz.getGenericSuperclass();
        if (type == null)
            return null;
        if (type instanceof ParameterizedType) {
            ParameterizedType tmpType = (ParameterizedType) type;
            for (Type t : tmpType.getActualTypeArguments()) {
                if (instanceOfViewModel((Class) t))
                    modelClass = (Class) t;
            }
            if (modelClass == null)
                modelClass = getViewModelClass(clazz.getSuperclass());
        } else {
            modelClass = getViewModelClass(clazz.getSuperclass());
        }
        return modelClass;
    }

    /**
     * 判断是否继承于ViewMdoel
     * @param clazz
     * @return
     */
    private static boolean instanceOfViewModel(Class clazz) {
        if (clazz == null)
            return false;
        if (!ViewModel.class.isAssignableFrom(clazz))
            return instanceOfViewModel(clazz.getSuperclass());
        else
            return true;
    }
}

fragemnt和adapter的改造方法可以参考下面链接,大同小异

参考链接:03Databinding基础-activity:fragment:adapter绑定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值