Получение эффекта мерцания при отображении горизонтального RecyclerView внутри вертикального RecyclerView
У меня есть Vertical
RecyclerView
и эта вертикаль RecyclerView's
каждый элемент содержит Horizontal RecyclerView
, так что я сделал это и работает нормально, за исключением фактора производительности, когда я прокручиваю Vertical RecyclerView
вертикальный список мерцает и дает плохое поведение. Я устанавливаю Adapter
для горизонтального RecyclerView
внутри вертикали RecyclerView
поэтому каждый раз при прокрутке я создаю новый адаптер и устанавливаю данные, на самом деле это приводит к производительности. Есть ли способ оптимизировать это?
Код
onBindViewHolder(){
setHorizontalList(items, horizontalolder);
}
setHorizontalList(ArrayList<Item> items, HorizontalHolder holder){
MyAdapter adapter = new MyAdapter();
adapter.setData(items);
holder.recyclerView.setAdapter(adapter);
holder.recyclerView.setLayoutManager(new LinearLayoutManager(mContext,
LinearLayoutManager.HORIZONTAL, false));
holder.recyclerView.setHasFixedSize(true);
}
1 ответ
Производительность плохая, потому что вы установили setHasFixedSize(boolean)
в true
, это приведет к каждому вложенному горизонтали RecyclerView
загрузить все свои виды, когда он станет видимым по вертикали RecyclerView
, Установка фиксированного размера true
обычно используется, чтобы сделать RecyclerView
оберните его содержание. Но чтобы обернуть его собственный контент, он должен знать размер его содержимого, поэтому он должен создавать все виды, когда становится видимым (знать его максимальную высоту и ширину).
Лучший способ оптимизировать ваши вложенные RecyclerView
s не устанавливать фиксированный размер true
Но это, вероятно, будет причиной вашего вложенного RecyclerView
не будет показан полностью, потому что он не знает его рост (так как различные виды в RecyclerView
может иметь разную высоту). Одним из способов решения этой проблемы является использование жестко заданной высоты или создание собственного CustomRecyclerView
класс, который расширяется RecyclerView
и переопределить методы измерений.