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

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

Solutions Collecting From Web of "Как добавить один и тот же взгляд к родительскому несколько раз, раздувая его только один раз"

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

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

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

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

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

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

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