0

Я уже проверил этот вопрос Android DataBinding in RecyclerView.ViewHolders with different layoutsAndroid DataBinding в ViewHolder с BaseViewHolder

Но в моем случае, ViewHolders есть супер класс BaseViewHolder. Все ViewHolders имеют одинаковую внешнюю компоновку, например, заголовок и кнопку закрытия, но макет содержимого отличается от вида вида до вида.

Я хочу использовать DataBinding и MVP для обработки этих представлений. Я могу получить Binder для каждого ViewHolder, но каждое привязку имеет другой тип класса. Все они расширяют 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. BaseViewHolder просто принимает ViewDataBinding, где я не могу достичь (легкий путь) взглядов, которые мне нужны.

Вариант 1: Я могу использовать findViewById (снова) - но это кажется не очень приятным.

Вариант 2: проверить экземпляр для DataBindings в BaseViewHolder и отличить - кажется, тоже не очень приятно.

Есть ли вариант 3 Я не вижу?

+0

Вам не нужен доступ к 'View's из' 'ViewHolder': все связанные с просмотром вещи выполняются в сгенерированных классах ViewDataBinding – pskink

+0

Что делать, если я хочу загрузить изображение, например ImageLoader.loadImageAsync()? Для этого мне нужен взгляд? – Informatic0re

+0

https://blog.stylingandroid.com/data-binding-part-3/ – pskink

ответ

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.

Смежные вопросы