Общие сведения о RecyclerView setHasFixedSize
У меня возникли проблемы с пониманием setHasFixedSize()
. Я знаю, что он используется для оптимизации, когда размер RecyclerView
не изменяется из документов.
Что это значит? В большинстве случаев a ListView
почти всегда имеет фиксированный размер. В каких случаях это не будет фиксированный размер? Означает ли это, что реальная недвижимость, которую он занимает на экране, растет с содержанием?
Ответы
Ответ 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.