通过继承下面的类就可以初始化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的改造方法可以参考下面链接,大同小异