Android MVVM-编程思想3(封装基类BaseMvvmActivity,BaseMvvmFragment)

前言

通过一个小案例,帮助大家了解MVVM。最终实现一个MVVM通用框架。代码:github。(如有错误之处,请在评论区指出,谢谢。如果感觉写的不错,请点赞,关注,谢谢。)

上一个小节,只是理论介绍了MVVM,DataBinding,ViewModel,LiveData,这一小节,讲解一下他们的使用方式。如果已经对这些基础知识很了解,可以直接看下一节。

目录:

Android MVVM-编程思想1(入门介绍MVVM,DataBinding,ViewModel,LiveData)
Android MVVM-编程思想2(入门实战MVVM,DataBinding,ViewModel,LiveData)
Android MVVM-编程思想3(封装基类BaseMvvmActivity,BaseMvvmFragment)

上一小节讲解了DataBinding,ViewModel,LiveData 的入门使用,这一节把这些初始化,通用设置封装到基类中。

分析UserActivity可以抽取的逻辑有哪些?

Activity 需要持有ViewDataBinding,和ViewModel的引用,这两个声明和初始化过程可以抽取到基类。

public class UserActivity extends AppCompatActivity {
    private ActivityUserBinding binding;
    private UserVM userVM;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_user);
        binding.setTitle("DataBinding绑定演示");
        userVM = ViewModelProviders.of(this).get(UserVM.class); //结合ViewModel
        binding.setLifecycleOwner(this);
        binding.setUserVM(userVM);
        binding.mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                userVM.getUser();
            }
        });
    }
}

抽取到基类之后的代码:BaseMvvmActivity
public abstract class BaseMvvmActivity<VM extends ViewModel, VDB extends ViewDataBinding> extends AppCompatActivity {
    protected VM mViewModel;
    protected VDB mViewDataBind;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutId());
        mViewDataBind = DataBindingUtil.setContentView(this, getLayoutId());
        mViewDataBind.setLifecycleOwner(this);
        //获得泛型参数的实际类型
        Class<VM> vmClass = (Class<VM>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        mViewModel = ViewModelProviders.of(this).get(vmClass);

        afterCreate();
    }


    protected abstract @LayoutRes
    int getLayoutId();

    protected abstract void afterCreate();

}

如何使用BaseMvvmActivity?
public class UserActivity extends BaseMvvmActivity<UserVM, ActivityUserBinding> {


    @Override
    protected int getLayoutId() {
        return R.layout.activity_user;
    }

    @Override
    protected void afterCreate() {
        mViewDataBind.setTitle("DataBinding绑定演示");
        mViewDataBind.setUserVM(mViewModel);
        mViewDataBind.mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mViewModel.getUser();
            }
        });
    }
}

是不是简单了一些。

抽取基类BaseMvvmFragment
public abstract class BaseMvvmFragment<VM extends ViewModel, VDB extends ViewDataBinding> extends Fragment {
    protected VM mViewModel;
    protected VDB mViewDataBind;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
        mViewDataBind = DataBindingUtil.inflate(inflater, getLayoutId(), container, false);
        mViewDataBind.setLifecycleOwner(this);
        //获得泛型参数的实际类型
        Class<VM> vmClass = (Class<VM>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        mViewModel = ViewModelProviders.of(this).get(vmClass);
        return mViewDataBind.getRoot();
    }


    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        afterCreate();
    }

    protected abstract @LayoutRes
    int getLayoutId();

    protected abstract void afterCreate();
}

基本的封装已经讲完了,后面有时间,我会把Rxjava集成进来。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值