Подтвердить что ты не робот

Общие сведения о RecyclerView setHasFixedSize

У меня возникли проблемы с пониманием setHasFixedSize(). Я знаю, что он используется для оптимизации, когда размер RecyclerView не изменяется из документов.

Что это значит? В большинстве случаев a ListView почти всегда имеет фиксированный размер. В каких случаях это не будет фиксированный размер? Означает ли это, что реальная недвижимость, которую он занимает на экране, растет с содержанием?

4b9b3361

Ответ 1

У очень упрощенной версии RecyclerView есть:

void onItemsInsertedOrRemoved() {
   if (hasFixedSize) layoutChildren();
   else requestLayout();
}

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

Избегайте ненужных проходов макета, установив setHasFixedSize в true, когда вы добавляете или удаляете элементы в RecyclerView и не изменяете его высоту или ширину.

Ответ 2

Может подтвердить setHasFixedSize относится к самому RecyclerView, а не к размеру каждого адаптированного к нему элемента.

Теперь вы можете использовать android:layout_height="wrap_content" в RecyclerView, который, среди прочего, позволяет CollapsingToolbarLayout знать, что он не должен разрушаться, когда RecyclerView пуст. Это работает только при использовании setHasFixedSize(false) в RecylcerView.

Если вы используете setHasFixedSize(true) в RecyclerView, это поведение, чтобы предотвратить слияние CollapsingToolbarLayout, не работает, хотя RecyclerView действительно пуст.

Если setHasFixedSize был связан с размером элементов, он не должен иметь никакого эффекта, если RecyclerView не имеет элементов.

Ответ 3

ListView имел аналогичную именованную функцию, которая, как я думаю, отражала информацию о размере отдельных высот элементов списка. В документации для RecyclerView довольно четко указано, что она относится к размеру самого RecyclerView, а не к размеру его элементов.

Из комментария источника RecyclerView выше метода setHasFixedSize():

 * RecyclerView can perform several optimizations if it can know in advance that changes in
 * adapter content cannot change the size of the RecyclerView itself.
 * If your use of RecyclerView falls into this category, set this to true.

Ответ 4

setHasFixedSize (true) означает, что RecyclerView имеет дочерние элементы (элементы) с фиксированной шириной и высотой. Это позволяет оптимизировать RecyclerView, вычисляя точную высоту и ширину всего списка на основе вашего адаптера.

Ответ 5

Это влияет на анимацию recyclerview, если она false.. вставка и удаление анимаций не отображаются. поэтому убедитесь, что он true, если вы добавили анимацию для recyclerview.