#android #android-recyclerview
#Android #android-recyclerview
Вопрос:
Этот новый ViewHolder должен быть создан с новым представлением, которое может представлять элементы данного типа. Вы можете либо создать новое представление вручную, либо увеличить его из файла XML-макета.
но затем он продолжает говорить:
Новый ViewHolder будет использоваться для отображения элементов адаптера с помощью onBindViewHolder(ViewHolder, int, List). Поскольку он будет повторно использоваться для отображения разных элементов в наборе данных, рекомендуется кэшировать ссылки на вспомогательные представления представления, чтобы избежать ненужных вызовов findViewById(int).
Могу ли я привести пример того, что означает кэширование ссылок на вспомогательные представления представления вместо вызова findViewById. Я имею в виду, что в конструкторе viewholders я уже вызываю findViewById. что-то вроде этого:
public class MyViewHolder extends RecyclerView.ViewHolder{
public TextView review;
public ImageView iv;
public MyViewHolder(View view) {
super(view);
review = (TextView) view.findViewById(R.id.gridview_text);
iv = (ImageView) view.findViewById(R.id.gridview_image);
}
}
это неправильно? как их можно кэшировать?
Комментарии:
1. Он кэшируется, потому что для всех элементов в наборе данных, которые будут заполнять ваш RecyclerView, используется один «шаблон» представления, поэтому их нужно запускать только один раз. То, что у вас есть, правильно — убедитесь, что все
onClick
прослушиватели находятся либо в конструкторе вашего держателя, либо обрабатываются через интерфейс, НО НИКОГДА вonBindViewHolder()
методе.2. каждый раз, когда создается экземпляр ViewHolder, в моем примере будет вызываться findViewById. Разве конструктор MyViewHolder не вызывается для каждой ячейки, создаваемой в списке? Как это тогда называется кэшированием, если оно вызывается для каждого элемента списка.
Ответ №1:
То, что вы опубликовали, — это именно то, что они подразумевают под кэшированием представлений в viewholder. Это позволяет избежать необходимости использовать findViewById()
каждый раз, когда вам нужно привязать к нему данные.
Комментарии:
1. я немного смущен. для каждой отдельной ячейки в RecyclerView необходимо создать объект ViewHolder. Таким образом, findViewById вызывается много раз изначально. Но когда ячейка перерабатывается, я предполагаю, что новый объект ViewHolder не будет создан, он будет просто повторно использоваться из некоторого пула. правильно ли это?
2. @j2emanue да, это правильно. Отсюда и название «Просмотр переработчика «. Вот почему рекомендуется использовать
findViewById()
изначально и сохранять ссылки на эти представления (как это делает ваш код), чтобы вам не приходилось делать это снова при привязке данных к viewholder.