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

Закладка макета 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);

Однако это добавляет ненужное представление в иерархии.

Каким будет рекомендуемый способ сделать это?

4b9b3361

Ответ 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);

Таким образом, вы не получите огромную иерархию представлений.