Подтвердить что ты не робот

Как добавить один и тот же взгляд к родительскому несколько раз, раздувая его только один раз

У меня есть 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);
        }
4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

Я не уверен, что у вас есть, но вы создаете его вручную для раздувания 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

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

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);
    }

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