Как оптимизировать 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....
fuset, нет, потому что команда инженеров из гугла год писала то, что ты хочешь. Не изобретай велосипеды. Всю твою разметку можно свободно переиспользовать.
Денис Загаевский, "Не изобретай велосипеды. Всю твою разметку можно свободно переиспользовать.", что ListView, что Recyclerview когда их добавляешь в разметку они занимают тупо весь экран и скол нужно всего фрагмента а не только лист вью + свой виджет для обновления фрагмента типа рефреш поэтому я не хочу это использовать
addView() метод быстрый. Вы слишком много всего делаете в UI потоке. Заполняйте ваш LinearLayout плейсхолдерами и выносите создание вьюшек в AsyncTask, как это всегда делается.
Однако, если вы создаёте схожие вью и заполняете их разными данными, то смотреть надо в сторону RecyclerView, он именно для этого предназначен. И, нет, с ним можно сделать всё что угодно, а не тратить ресурсы на постоянную перерисовку большой группы вьюшек.
"addView() метод быстрый. Вы слишком много всего делаете в UI потоке. Заполняйте ваш LinearLayout плейсхолдерами и выносите создание вьюшек в AsyncTask, как это всегда делается."
а можно пример пожалуйста, хотя бы самый простой именно "Заполняйте ваш LinearLayout плейсхолдерами"
Так как создание view у меня как раз в AsyncTask
Денис Загаевский, это не новые тренды, а старые. Во времена восьмого апи, так решали проблемы с созданием сложных динамических сеток. Сегодня, это используют, главным образом, при разборе HTML на отдельные вью. Пример будет немного позже.
во-первых при вашем подходе все въюхи держатся в памяти, во-вторых если посмотрите исходник addView, то вы увидите, что при добавлении въюх в контейнер в общем случае начинается лейаут-траверс для всего дерева. Сложно сказать что вы там наверстали, но стоит иметь ввиду, что для окончательного позиционирования вьюх, лейаут-траверс может происходить несколько раз в зависимости от используемых контейнеров. Десериализация - тоже не дешевый код (но у вас я так понял он вынесен в асинк). В результате получается то, что получается. С учетом наличия лейаут-траверсов никакими асинками вы это не вылечите. Вам правильно сказали - добавление итемов на скролле это классический юзкейс ресайклеров - осильте ресайклеры и используйте их