Является ли это разрушением всей идеи использования переработанного списка?
Это зависит от того, сколько всего itemView
подсписка составляет.Если подсписок - это единственное, что вы отображаете, тогда да, вы побеждаете большую часть прироста производительности.Вы по-прежнему раздувает представления каждый раз, когда привязываете ViewHolder
, и это одна из вещей, которых вы пытаетесь избежать при использовании RecyclerView.
Это также зависит от того, насколько велик подсписок.Если это всего лишь три элемента, то стоимость уменьшается.Если подсписок состоит из сотен элементов, то стоимость велика.
Один из вариантов - использовать sub-RecyclerView вместо LinearLayout и подключить каждый sub-RecyclerView к одному и тому же shared * 1012.*.Таким образом, вы получаете все преимущества RecyclerView по сравнению с прокручиваемой LinearLayout, но даже лучше, потому что каждый sub-RecyclerView может брать ViewHolders от других.
Если это слишком сложно для вас, вы можете простооптимизировать код, который вы уже написали.Вместо того, чтобы каждый раз очищать список, а затем заново раздувать правильное количество представлений, вы можете повторно использовать существующие представления (и создавать новые, только если их недостаточно) и удалять дополнительные представления, если их слишком много.
int i = 0;
// reuse existing views
for (; i < elements.size() && i < itemInRecycler.getChildCount(); i++) {
Element element = elements.get(i);
CustomView view = (CustomView) itemInRecycler.getChildAt(i);
view.setDisplayData(element);
}
// create new views if there weren't enough to reuse
for (; i < elements.size(); i++) {
Element element = elements.get(i);
CustomView view = inflate();
view.setDisplayData(element);
itemInRecycler.addView(view);
}
// remove any extras after we've reused everything
int viewsToRemove = itemInRecycler.getChildCount() - i;
if (viewsToRemove > 0) {
itemInRecycler.removeViews(i, viewsToRemove);
}
В мире, где коллекция elements
всегда содержит от пяти до семи элементов, скажем, этот подход гарантирует, что вы всегда повторно используете первые пять CustomView
с, а затемтолько накачивание или удаление 0-2 лишних CustomView
с.