Получение эффекта мерцания при отображении горизонтального 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);
}

comment
Вы нашли решение этой проблемы? Я видел аналогичную проблему, когда фон моего внутреннего элемента не соответствует wrap_content, как должно быть.   -  person RobGThai    schedule 26.11.2016
comment
Да. Я создал адаптер для второго RecyclerView внутри класса ViewHolder. Так что он не будет создавать новые экземпляры.   -  person droidev    schedule 27.11.2016
comment
Я сделал то же самое, но мой фон стал шатким. Не могли бы вы быстро взглянуть на мою проблему? stackoverflow.com/questions/40823501 /   -  person RobGThai    schedule 27.11.2016


Ответы (1)


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

Лучший способ оптимизировать ваши вложенные RecyclerView — не устанавливать фиксированный размер true. Но это, вероятно, приведет к тому, что ваши вложенные RecyclerView не будут отображаться полностью, потому что он не знает его высоты (поскольку разные представления в RecyclerView могут иметь разную высоту) . Один из способов решить эту проблему — использовать жестко заданную высоту или создать собственный класс CustomRecyclerView, который расширяет RecyclerView и переопределяет методы измерения.

person Jeffalee    schedule 18.05.2016
comment
не работает, проблема связана с созданием адаптеров внутри onBindViewHolder(), вот что мне нужно оптимизировать. - person droidev; 18.05.2016