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

1
AMAN KUMAR 9 Апр 2021 в 16:38

1 ответ

Лучший ответ

RecyclerView.Adapter то, что он делает: перерабатывает предметы (как следует из названия). В списке нет одного представления для каждого элемента в источнике данных одновременно. Адаптер следит за тем, чтобы в памяти было достаточно представлений, чтобы всегда отображать список плавно. Когда строка покидает поле обзора при прокрутке, это представление повторно используется для повторного использования в следующем представлении для входа в соответствии с размером экрана.

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

Другой метод onBindViewHolder вызывается каждый раз, когда необходимо обновить данные в строке для обновления представления. Это вызывается каждый раз, когда строка попадает в поле просмотра экрана.

Итак, ответ из учебника: сделайте это на onBindViewHodlder, потому что, если атрибут isAdmin изменится, эту строку нужно будет обновить. Если сделать это на onCreateViewHolder, это произойдет только один раз при создании строки.

Но ваш isAdmin - это значение конструктора, которое нельзя переназначить, поэтому это означает, что при создании строк кнопка будет скрыта или видна навсегда. И это не имеет значения, потому что ваша структура должна определить, является ли администратор из другого источника, который отделен от которого получена структура данных строки.

Если в каком-то случае вы хотите:

  • сделать его более гибким и простым в обслуживании в будущем
  • или, может быть, вы знаете, что будет случай, когда будет список с администраторами, а не с строками администраторов

Тогда решение состоит в том, чтобы переместить атрибут isAdming в ваш NoticeModel, что повлечет за собой изменение вашей структуры данных.

Если вы хотите проверить что-либо, сказанное выше, получите источник данных с большим количеством элементов, а затем добавьте 2 журнала, один на onCreateViewHolder и один на onBindViewHolder. Вы увидите, как on create вызывается только иногда, но bind вызывается всегда.

1
cutiko 9 Апр 2021 в 14:09