2016-07-04 5 views
1

Предположим, у меня есть RecyclerView с сотнями предметов. Существует несколько разных типов представлений. Когда я нажимаю на элемент, он должен изменить свой пользовательский интерфейс. Как я вижу, есть два варианта:Каков наиболее эффективный способ изменения пользовательского интерфейса элементов в RecyclerView?

  • Измените элемент на другой вид и сообщите об адаптере адаптера, чтобы он мог раздуть новое представление, чтобы отобразить новое состояние.
  • имеют оба представления в одном файле xml. в любой момент видно только одно. Переключайтесь между ними, используя функцию setVisibility, когда изменяется состояние.

Есть много статей в Интернете о гетерогенных RecyclerViews с использованием многих типов просмотра, но я до сих пор видел о наилучшей практике, когда взгляды пункта динамически изменять и RecyclerView становится более разнородной с течением времени. Какой метод лучше всего изменить существующий вид в ресайклере? какие компромиссы?

ответ

1

Компромиссы довольно очевидны.

  • Оба UIs в одном Вид: в зависимости от ваших взглядов, это может:
    • Сделайте виды тяжелых надуть и расположение
    • Замедлить процесс связывания, так как вы должны связывать как UIs
    • В конце концов, отстаньте от процесса прокрутки.

С другой стороны, у вас есть быстрый, точный контроль над тем, что Представления должны изменить внешний вид в определенное время. Наличие обоих пользовательских интерфейсов в одном и том же месте допускает более тонкие анимации и переходы между одним государством и другим.

  • Различные виды типов: Я думаю, что ваш случай не является причиной того, что вначале были созданы типы представлений - они предназначены для одновременного использования разных детей в разных положениях списка. Это:
    • Может замедлить переход. Вы должны быть предельно осторожны в том, как вы говорите адаптеру, чтобы перезагрузить объекты. Поскольку вы можете читать где угодно, вам может понадобиться избежать notifyDataSetChanged(), который перезагружает любой объект и, скорее, использует notifyItemChanged() или такой. Это требует некоторой работы и внимания.
    • Не позволяет (не легко, по крайней мере) для визуального перехода между одним состоянием и другим.

Ответ заключается в том, ИМО, только вы можете знать. Вы должны задать себе вопрос:

  • Эти виды комплексные? У них есть глубокая иерархия? Будет ли снижать производительность (например, в обязательной части)?

  • Было бы легко понять, какие виды изменены, и позвоните по номеру notifyItemChanged(int position) во втором случае? Перезагрузка всего набора данных оказывает огромное влияние на производительность, если у вас много предметов.

  • Вам нужен визуальный переход между одним государством и другим? Может быть, вы хотите, чтобы оба пользовательских интерфейса вписывались в один контейнер (например, различную информацию в CardView)? Если это обязательно, то вариант 1 лучше.

  • У вас есть более 2 пользовательских интерфейсов? Если это так, я бы пошел с типами просмотров, чтобы не размещать слишком много просмотров в одном дочернем макете.

и другие подобные вопросы.

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