@newdancer

Как реализовать viewholder при динамическом заполнении linearlayout view элементами?

Как реализовать viewholder при динамическом заполнении linearlayout view элементами?
Пробовал так:
private static class ProgramHolder{
        TextView textName, textSecondName, textSpecName;
    }

и смо заполнение
for (int d = 0; d < doctors.size(); d++) {
                if (pHolder == null) {
                    pHolder = new ProgramHolder();
                    layerDoctors = mLayoutInflater.inflate(R.layout.item_doctor, null);
                    pHolder.textName = (TextView) layerDoctors.findViewById(R.id.textName);
                    pHolder.textSecondName = (TextView) layerDoctors.findViewById(R.id.textSecondName);
                    pHolder.textSpecName = (TextView) layerDoctors.findViewById(R.id.textSpecName);
                    layerDoctors.setTag(pHolder);
                }
                Doctor doctor = doctors.get(d);
                pHolder.textName.setText(doctor.getSecond_name());
                pHolder.textSecondName.setText(doctor.getFirst_name() + " " + doctor.getMiddle_name());
                pHolder.textSpecName.setText(doctor.getSpec_name());
                linDoctors.addView(layerDoctors);
            }

Но получаю ошибку
The specified child already has a parent. You must call removeView() on the child's parent first.

Как бороться с этим или как будет правильно? Нужно в linearlayout добавить view элементов порядка 200. Поэтому хотелось облегчить заполнение, чтобы не создавать массив view на 200 элементов
  • Вопрос задан
  • 214 просмотров
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
о_О А чего вы таким способом хотели добиться? Один раз создаёте layerDoctors, и пытаетесь его несколько раз добавить в контейнер. Уже на втором разе вы получаете эту ошибку, потому что вьюха уже добавлена.
Дальше. 200 элементов в LinearLayout, да ещё, судя по всему, не простые - это гарантированный способ получить тормоза. Конечно же, надо использовать виртуализованный список. Например, ListView, и, конечно же с паттерном вьюхолдер, который вы почти освоили.
Но я бы рекомендовал сразу использовать RecyclerView, он посовременнее и там сложнее ошибиться. И вообще плюшек много.

P.S. немного разверну ответ. ViewHolder - это паттерн, позволяющий улучшить переиспользование вьюх в виртуализованных контейнерах.
Что значит виртуализованных - это значит, что в контейнер вы ложите больше элементов, чем есть вьюх. Вьюхи переиспользуются по мере надобности (выход за границы экрана).
В LinearLayout переиспользования нет. Вы положите в него 200 элементов - будет очень большой оверхерд по памяти и отрисовка будет тупить. ViewHolder тут не поможет по определению.
Ответ написан
Ваш ответ на вопрос

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

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