Android. Оправдано ли использование фрагментов в RecyclerView?

У меня есть карточка которая помимо прочей информации может содержать в себе изображение, слайдер изображений (сторонняя библиотека) или видео (YouTubeAPI). Раньше я в layout карточки просто указывал все три медиа элемента (изображение, слайдер, видео) и, в зависимости от нужд, изменял их видимость, скрывая ненужные элементы и оставляя видимым только нужный.

Потом я решил попробовать использовать фрагменты. Сделал три фрагмента, под каждый элемент (замечу что класс фрагментов содержит в себе всю логику элемента, ему стоит лишь передать параметры для инициализации, а все остальное он сделает сам), и попытался использовать в RecyclerView. Если раньше у меня в карточке было три элемента, то теперь я хотел просто помещать нужный мне фрагмент в специальный контейнер в карточке. Но не тут то было. В onBindViewHolder моего адаптера RecyclerView вот такой код заменяет только первый элемент:

ImageSliderFragment fragment = ImageSliderFragment.newInstance(currentItem.images, mContext);
fragmentManager.beginTransaction().replace(R.id.card_media_container, fragment).commit();


Также я прочитал что использование фрагментов в RecyclerView крайне нежелательно. Вопрос - стоит ли в данном случае использовать фрагменты, ради упрощения (эти фрагменты также используются в другом активити, к тому же раньше вся логика медиа элементов раньше была в адаптере RecyclerView, а теперь вынесена в ихние классы фрагментов). Или же стоит использовать старую схему - карточка сразу содержит в себе все медиа элементы, которые делаются видимыми/невидимыми и заполняются по мере необходимости? Но тогда возникает дублирование кода т.к. логика элементов опять будет в адаптере RecyclerView.

И если использование фрагментов оправдано - как правильно использовать их в RecyclerView? У меня почему-то заполняется только первый элемент.
  • Вопрос задан
  • 682 просмотра
Пригласить эксперта
Ответы на вопрос 2
artemgapchenko
@artemgapchenko
Не нужно объединять три View в один фрагмент, так как у RecyclerView уже есть следующие методы для создания и привязки ViewHolder'a:
public abstract void onBindViewHolder(VH holder, int position);

и
public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);

Параметр viewType - это то, что вам нужно. Переопределяете метод

public int getItemViewType(int position);

так, чтобы для каждого элемента адаптера он возвращал нужный тип (видео/слайдер/изображение), в onCreateViewHolder() инфлейтите нужную вьюху в зависимости от типа вьюхи, и создаёте ViewHolder, а в onBindViewHolder() привязываете нужный элемент к вьюхолдеру, в зависимости от того, какой тип у элемента.
Ответ написан
@gmikhail94 Автор вопроса
Решение по поводу заполнения только первого элемента - нужно указывать не обычный id контейнера, а присваивать контейнеру каждого элемента уникальный id и уже в него вставлять фрагмент.

Вопрос по поводу целесообразности использования фрагмента в конкретно данном случае остается открытым.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы