Возможно ли инициализировать Moxy MvpPresenter в RecyclerView Adapter
Возможно ли сделать inject MvpPresenter в RecyclerView Adapter или библиотека позволяет делать это только для фрагмента или активности? И насколько правильно так делать с точки зрения архитектуры? Код адаптера:
public class ElementsRecyclerAdapter extends RecyclerView.Adapter<ElementsRecyclerAdapter.ElementsViewHolder> {
List<Elements> elementsList;
public ElementsRecyclerAdapter(List<Elements> elementsList){
this.elementsList = elementsList;
}
@NonNull
@Override
public ElementsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_elements, parent,false);
return new ElementsViewHolder(view);
}
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public void onBindViewHolder(@NonNull ElementsViewHolder holder, int position) {
holder.elementName.setText(elementsList.get(position).getName());
holder.deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
holder.elementsAdapterPresenter.deleteElement(elementsList.get(position));
}
catch (NullPointerException e){
e.printStackTrace();
}
}
});
}
@Override
public int getItemCount() {
return elementsList.size();
}
public static class ElementsViewHolder extends RecyclerView.ViewHolder implements ElementsAdapterView{
TextView elementName;
Button updateButton;
Button deleteButton;
@InjectPresenter
ElementsAdapterPresenter elementsAdapterPresenter;
public ElementsViewHolder(@NonNull View itemView) {
super(itemView);
elementName = (TextView) itemView.findViewById(R.id.element_name);
updateButton = (Button) itemView.findViewById(R.id.update_element);
deleteButton = (Button) itemView.findViewById(R.id.delete_element);
}
@Override
public void onUpdate(Elements element) {
}
@Override
public void onDelete(Integer id) {
}
}
}
При дебаге elementsAdapterPresenter = null
Ответы (1 шт):
В адаптер можно инжектнуть презентер, но нужно понимать специфику данного решения. С точки зрения архитектуры в этом ничего страшного нет и это можно делать, но это используется в очень редких ситуациях, что может наталкнуть других разработчиков на мысли "А зачем?".
В каком случае имеет смысл делать inject презентера в ViewHolder? В том случае, если очень много логики по отображению каких либо данных на элементе, есть определенные случаи, сейчас приведу пример:
У нас есть экран со списком профилей пользователей, и допустим есть общая модель профиля включающая в себя базовую информацию : "Имя,Фамилия,Статус", а для того чтобы получить картинку профиля нужно дергать новый зарос. Такие инетерсные и специфичные решения могут встречаться в библиотеках. И запрос дергается для каждой карточки(каждого ViewHolder) в этом случае имеет смысл использовать инжект презентера во ViewHolder, в остальных других случаях как написали в комментариях лучше работать через интерфейс.