2016-10-17 1 views
0

Поскольку RecyclerView использует ViewHolders, это означает, что у вас должен быть предопределенный макет для каждой строки. Но что, если каждая строка должна отображать переменное количество просмотров?RecyclerView с неизвестными/переменными строками строк

Например, я создаю приложение для обмена мгновенными сообщениями, в котором пользователи могут прикреплять изображения к сообщениям. Они могут прикрепляться от 0 до x изображений. Когда вы создаете RecyclerView для отображения этих изображений (загружаемых с сервера), как бы вы делали строки, содержащее правильное количество ImageViews для их отображения?

Есть несколько способов, которые я могу придумать, но ни один из них не кажется хорошим вариантом.

  1. Создайте ImageViews в onBindViewHolder, добавьте их в макет в ViewHolder. (Разве это не то, что пытается попытаться предотвратить ViewHolder? Это, вероятно, будет медленным, особенно с большим количеством фотографий)
  2. Ограничьте количество изображений, которые пользователь может прикрепить к сообщению, а затем добавьте x ImageViews в макет, который установлены на невидимые/ушли. В onBindViewHolder установите ImageViews для отображения изображения и установите эти ImageViews видимыми. (Что делать, если я разрешаю фотографии & видео, которые нужно вставить? Должен ли я затем добавить x ImageViews и x VideoViews?)
  3. Поместите GridView в каждый элемент RecyclerView и заполните GridView внутри onBindViewHolder. (Я предполагаю, что это не принесло бы пользы от вариант №1, потому что это почти то же самое?)

Это все, что я могу придумать. Есть ли другой вариант, который предназначен для такой ситуации, с которой я не сталкивался? Или каковы типичные подходы к этой проблеме?

ответ

0

Вам необходимо создать гетерогенный RecyclerView, который отобразит несколько разных ViewHolder. Это можно сделать несколькими способами.

Основной подход заключается в том, что на основе количества фотографий/видео, связанное с каждым элементом в вашей RecyclerView.Adapter вы бы переопределить getItemViewType(int position) (метод, который является частью RecyclerView.Adapter класса), чтобы вернуть другой int. Этот int является параметром viewType, переданным в createViewHolder(ViewGroup parent, int viewType). Затем вы использовали бы правильный формат ViewHolder /, основанный на аргументе viewType.

См. here за хороший учебник.

Если вы не против использовать библиотеку для альтернативного подхода, я рекомендую AdapterDelegates.

+0

Я знаю о разных типах просмотра в RecyclerView, но это не относится к моей проблеме. Типы просмотра предназначены для применения различных макетов к строкам, но все же предполагается, что строки имеют статические макеты. Мне нужно решение, в котором элементы RecyclerView имеют переменное количество просмотров в макете. – user7028506

+0

Я вижу. Затем я пошёл бы со своей второй предложенной идеей для этого, используя один зритель и показывающий/скрывающийся на основе содержимого строки, или я бы все же ограничивал количество изображений и видео, как в идее 2, но создавал отдельные зрители, представляющие возможные комбинации. –

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