Задать вопрос
@fuset

Как оптимизировать addView в LinearLayout vertical?

Всем привет.
Есть LinearLayout vertical
Мне с сервера приходят данные где то 15 items
Так же есть свой компонент (в нем около 3 imageview 1 textview и 2 button)
Так вот когда первый раз вставляется все норм вроде не подглючивает (15 штук сразу)
А вот когда я подгружаю с сервера если клиент еще скролит создаю компоненты и закидываю их через метод addView в LinearLayout, то происходит вис на 1-3 секунды

Добавляю объекты вот так:
MyView myView = new MyView(getActivity()); (а не через inflate)
bla... bla...
linearLayout.addView(myView)

Первый способ был такой, собрать все view в новый LinearLayout и потом вставить этот LinearLayout в основной, но это тоже не помогло
Пожалуйста не предлагайте ListView и Recyclerview (С ним мою кухню не запустишь), но мне нужно решение на LinearLayout

Есть какие нибудь мыслишки?
Я как раз понял что этот вис происходит из за того, что все компоненты хранятся в памяти и когда происходит добавление, то android сразу их прорисовывает.
Есть какое нибудь решение? или кастыль, очень нужнооо, help....
  • Вопрос задан
  • 299 просмотров
Подписаться 1 Простой 11 комментариев
Пригласить эксперта
Ответы на вопрос 2
thelongrunsmoke
@thelongrunsmoke
Программист
addView() метод быстрый. Вы слишком много всего делаете в UI потоке. Заполняйте ваш LinearLayout плейсхолдерами и выносите создание вьюшек в AsyncTask, как это всегда делается.
Однако, если вы создаёте схожие вью и заполняете их разными данными, то смотреть надо в сторону RecyclerView, он именно для этого предназначен. И, нет, с ним можно сделать всё что угодно, а не тратить ресурсы на постоянную перерисовку большой группы вьюшек.
Ответ написан
@stoptalking
во-первых при вашем подходе все въюхи держатся в памяти, во-вторых если посмотрите исходник addView, то вы увидите, что при добавлении въюх в контейнер в общем случае начинается лейаут-траверс для всего дерева. Сложно сказать что вы там наверстали, но стоит иметь ввиду, что для окончательного позиционирования вьюх, лейаут-траверс может происходить несколько раз в зависимости от используемых контейнеров. Десериализация - тоже не дешевый код (но у вас я так понял он вынесен в асинк). В результате получается то, что получается. С учетом наличия лейаут-траверсов никакими асинками вы это не вылечите. Вам правильно сказали - добавление итемов на скролле это классический юзкейс ресайклеров - осильте ресайклеры и используйте их
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы