首页 文章

ViewHolder中的Android DataBinding与BaseViewHolder

提问于
浏览
0

我已经检查了这个问题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 回答

  • 0

    至少还有两种方法可以做到这一点 .

    一种方法是为外部布局创建一个单独的布局文件 layout_outer ,并将内部布局膨胀为 inner_container

    LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
    LayoutOuterBinding binding = DataBindingUtil.inflate(inflater, R.layout.layout_outer, viewGroup, false);
    ListItemABinding bindingA = DataBindingUtil.inflate(inflater, R.layout.list_item_a, binding.innerContainer, true);
    

    然后你要创建一个构造函数

    BaseViewHolder(LayoutOuterBinding outer, ViewDataBinding binding)
    

    相反,并在 outer 中拥有你所需要的一切 .

    相反的方式也是可能的 . 只需使用 <include android:id="@+id/outer" ... /> 包含外部布局的各个部分,然后从绑定 bindingA.outer 中提供它 .

相关问题