Закладка макета Android для динамически добавленного вида
В моей Android-операции мне нужно добавить один вид динамически (во время выполнения) в определенной позиции в макете. Представление, которое будет добавлено, определяется во время выполнения. Например, макет может выглядеть примерно так:
<LinearLayout ...>
<TextView ... />
<!-- Dynamic item to be added here -->
<TextView ... />
</LinearLayout>
Каков наилучший способ достичь этого?
Одним из решений является использование layout.addView(view, index)
, но я бы предпочел не жестко индексировать индекс.
Другим решением является использование FrameLayout в качестве заполнителя, и место может иметь динамический вид внутри FrameLayout, например:
<LinearLayout ...>
<TextView ... />
<FrameLayout android:id="@+id/placeholder" />
<TextView ... />
</LinearLayout>
Тогда:
findViewById(R.id.placeholder).addView(view);
Однако это добавляет ненужное представление в иерархии.
Каким будет рекомендуемый способ сделать это?
Ответы
Ответ 1
Я думаю, что использование FrameLayout в качестве заполнителя для вашего представления, добавленного во время выполнения, является хорошим решением.
Я бы не стал беспокоиться о влиянии дополнительного "лишнего" представления на производительность.
Ответ 2
Вы также можете добиться этого "ленивого включения", используя ViewStub
, как описано в этой (довольно старой) статье от разработчиков Android.
Ответ 3
Вы можете использовать addView (View child, int index) без жесткого кодирования точного индекса.
Если один из соседей взглядов может быть исправлен (например, есть конкретная метка непосредственно перед местом, в которое вы хотите вставить элемент), вы можете получить индекс этого представления и вставить после этого динамический вид:
View previousView = findViewById(ID_OF_PREVIOUS_VIEW);
ViewGroup parent = (ViewGroup)previousView.getParent();
int previousIndex = parent.indexOfChild(previousView);
parent.addView(theDynamicallyCreatedView, previousIndex + 1);
Или вы можете использовать ViewStub, но вместо раздувания макета просто удалите его:
View placeholder = findViewById(ID_OF_STUB);
ViewGroup parent = (ViewGroup)previousView.getParent();
int index = parent.indexOfChild (placeholder);
parent.removeViewAt(index);
parent.addView(theDynamicallyCreatedView, index);
Таким образом, вы не получите огромную иерархию представлений.