Я нарушаю производительность и использование представления переработчика? - PullRequest
0 голосов
/ 17 октября 2018

Таким образом, мы должны использовать представление переработчика, когда хотим показать большой список элементов.
Преимущество этого заключается в том, что представления используются повторно, поэтому мы не раздуваем каждое представление в списке и сохраняемони сохраняются в памяти и просто сохраняют в памяти те, которые отображаются на экране, перерабатывая остальное.
Но что, если переработанное представление само по себе является "мини-списком"?
Т.е. для каждого переработанного элемента мы меняем его структуру, удаляявсе дочерние представления и добавление новых дочерних представлений?
Является ли это разрушением всей идеи использования переработанного списка?
Пример, о котором идет речь (itemInRecycler - это вертикальная LinearLayout, которая передается в держатель представления переработчика):

itemInRecycler.removeAllViews();  
for(element: elements) {  
   CustomView view = inflate();  
   view.setDisplayData(element);  
   itemInRecycler.addView(view);  
} 

1 Ответ

0 голосов
/ 17 октября 2018

Является ли это разрушением всей идеи использования переработанного списка?

Это зависит от того, сколько всего 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 с.

...