我已经检查了这个问题Android DataBinding in RecyclerView.ViewHolders with different layouts
但就我而言,ViewHolders有一个超类BaseViewHolder . 所有ViewHolders都具有相同的外部布局,如 Headers 和关闭按钮,但内容布局从viewtype到viewtype不同 .
我想使用DataBinding和MVP来处理这些视图 . 我能够为每个ViewHolder获取一个Binder,但每个绑定都有不同的类类型 . 所有这些都在扩展ViewDataBinding .
一些代码:
public ViewHolderA(ListItemABinding binding) extends BaseViewHolder{
super(binding);
... do stuff with the binding
}
public ViewHolderB(ListItemBBinding binding) extends BaseViewHolder {
super(binding);
... do stuff with the binding
}
public BaseViewHolder(ViewDataBinding binding) extends RecyclerView.ViewHolder {
super(binding.getRoot());
//access the header and the button here!!!
}
适配器内部:
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int itemType) {
switch (itemType) {
case SmartHomeBase.VIEW_TYPE_A:
ListItemABinding bindingA = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.list_item_a, viewGroup, false);
return new ViewHolderA(bindingA);
default:
ListItemBBinding bindingB = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.list_item_b, viewGroup, false);
return new ViewHolderB(bindingB);
}
}
我从DataBindingUtil得到的是ListItemABinding和ListItemBBinding,它们都包含我在BaseViewHolder中需要的Button和Header . BaseViewHolder只接受ViewDataBinding,我无法访问(简单方法)我需要的视图 .
选项1:我可以使用findViewById(再次) - 但这似乎不太好 .
选项2:在BaseViewHolder和cast中检查DataBindings的instanceof - 看起来也不是很好 .
是否有选项3我看不到?
1 回答
至少还有两种方法可以做到这一点 .
一种方法是为外部布局创建一个单独的布局文件
layout_outer
,并将内部布局膨胀为inner_container
然后你要创建一个构造函数
相反,并在
outer
中拥有你所需要的一切 .相反的方式也是可能的 . 只需使用
<include android:id="@+id/outer" ... />
包含外部布局的各个部分,然后从绑定bindingA.outer
中提供它 .