Как кэшировать ссылки на просмотр viewholder в Android RecyclerView

#android #android-recyclerview

#Android #android-recyclerview

Вопрос:

Из документов Android

Этот новый 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.