这就是我Adapter
使用MVVM (+Databinding)和Dagger-2.11-rc2创建一个:
适配器:
public class ItemAdapter extends RecyclerView.Adapter<BindableViewHolder<ViewDataBinding>>{
private static int TYPE_A = 0;
private static int TYPE_B = 1;
...
@Override
public BindableViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_A) {
return new ItemViewHolder(new ItemRowView(parent.getContext()).getBinding());
}
...
}
@Override
public void onBindViewHolder(BindableViewHolder holder, int position) {
if (holder.getItemViewType() == TYPE_A) {
((ItemViewHolderBinding) holder.getBinding()).getViewModel().setItemModel(((ItemModel) getItem(position)));
}
...
}
private static class ItemViewHolder extends BindableViewHolder<ItemViewHolderBinding> {
ItemViewHolder(ItemViewHolderBinding binding) {
super(binding);
}
}
}
可绑定视图持有者:
public abstract class BindableViewHolder<ViewBinding extends ViewDataBinding> extends RecyclerView.ViewHolder {
private ViewBinding mBinding;
public BindableViewHolder(ViewBinding binding) {
super(binding.getRoot());
mBinding = binding;
}
public ViewBinding getBinding(){
return mBinding;
}
}
由于我使用的是 Dagger,因此我不会在ViewModels
内部创建它们,Adapter
而是在它们各自的Android.View
. 我想这是有道理的,因为我Adapter
可能有 XAndroid.View
类型,那些视图可以有 YViewModel
等等......
基础视图:
public abstract class BaseView<ViewBinding extends ViewDataBinding, ViewModel extends BaseViewModel> extends FrameLayout {
@Inject
ViewModel mViewModel;
protected ViewBinding mBinding;
protected abstract void initBinding(final ViewBinding binding, final ViewModel viewModel);
...
private void initView(Context context) {
ViewInjection.inject(this);
mBinding = DataBindingUtil...
initBinding(mBinding, mViewModel);
...
}
...
}
基础视图模型:
public class BaseViewModel extends BaseObservable {...}
ItemRowView(或任何视图):
public class ItemRowView extends BaseView<ItemRowViewBinding, ItemRowViewModel> {
@Inject
ViewModelA mViewModelA;
@Inject
ViewModelB mViewModelB;
...
@Override
protected void initBinding(ItemRowViewBinding binding, ItemRowViewModel viewModel) {
binding.setViewModel(viewModel);
binding.setViewModelA(mViewModelA);
binding.setViewModelB(mViewModelB);
...
}
}
现在,这种方法适用于活动、片段等,但是当我使用视图时,我必须创建一个ViewInjecton,因为 Dagger 没有开箱即用。这就是我的做法(阅读直到您到达“ViewInjection 几乎是其他注入器的副本。”)
我的问题是:这是一个好方法吗?我是否正确使用了 MVVM 和 Dagger?有没有更好的方法可以在不创建ViewInjecton(并使用 Dagger-2.11)的情况下实现这一点?
谢谢你的时间。
ps:我已经使用了Adapter
示例,但是如果我想使用视图而不是片段,这种方法是相同的。与Adapters
您一起仅限于查看。