Как добавить один и тот же вид к родителю несколько раз, надувая его только один раз - PullRequest
32 голосов
/ 22 июня 2011

У меня есть LinearLayout с вертикальной ориентацией в качестве родителя, я хочу добавить несколько представлений программно несколько раз к этому родителю. Прямо сейчас я раздуваю ребенка каждый раз, получая новые ссылки на каждый элемент пользовательского интерфейса перед добавлением в родительский элемент. Это не кажется очень эффективным, есть ли лучший способ сделать это.

Текущий код, который я использую, приведен ниже. Если я раздуваю только один раз для цикла, я получаю ошибку во время выполнения: «он указал, что у дочернего элемента уже есть родительский элемент. Сначала необходимо вызвать removeView () для родительского элемента дочернего элемента.

        LayoutInflater inflator = LayoutInflater.from(getBaseContext());
        LinearLayout parentPanel = findViewById(R.id.parent_pannel);

        ArrayList<String> myList = getData();
        for(String data : myList) {
            // inflate child
            View item = inflator.inflate(R.layout.list_item, null);
            // initialize review UI
            TextView dataText = (TextView) item.findViewById(R.id.data);
            // set data
            dataText.setText(data);
            // add child
            parentPanel.addView(item);
        }

Ответы [ 4 ]

28 голосов
/ 29 июня 2011

Вы действительно проверяли, медленно ли надувается?Насколько я знаю, раздувание просмотра происходит очень быстро (почти так же быстро, как создание видов вручную).

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

5 голосов
/ 04 июня 2014

Вы не можете , даже если вы попытаетесь создать new view из старого view объекта, объект будет передан по ссылке, а не по значению, и, следовательно, вы получите Исключение как childAlreadyHasParent , и, таким образом, единственный способ - поместить view в for loop с количеством раз, которое вы хотите, чтобы оно было раздуто, и этот цикл должен содержать создание процесса от начала не только раздувания линий.

5 голосов
/ 29 июня 2011

Я не уверен, каково ваше мнение, но вы создаете его вручную, надувая XML:

   ArrayList<String> myList = getData();
    for(String data : myList) {

        LinearLayout layout = new LinearLayout(this);
        layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,             LayoutParams.WRAP_CONTENT));
        TextView textView = new TextView(this);
        textView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

        textView.setText(data);

        layout.addChild(textView);         

        parentPanel.addView(layout);
    }

Но да, вы явно пытаетесь сделать что-то, что было сделано для вас с Simple ListView & API

4 голосов
/ 07 декабря 2012

Раздувание несколько раз не может быть сделано таким же образом, делая это за один выстрел. Надеюсь, что это работает

LayoutInflater inflator = (LayoutInflater).getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    LinearLayout parentPanel = findViewById(R.id.parent_pannel);

    ArrayList<String> myList = getData();
    for(String data : myList) {
        // inflate child
        View item = inflator.inflate(R.layout.list_item, null);
        // initialize review UI
        TextView dataText = (TextView) item.findViewById(R.id.data);
        // set data
        dataText.setText(data);
        // add child
        parentPanel.addView(item);
    }

Это сработает, по крайней мере у меня сработало

...