Android. В чём разница между методами getChildAt() и getVirtualChildAt() у TableRow?

Они оба ведь возвращают дочерний элемент по индексу...


Ответы (2 шт):

Автор решения: Style-7

Разница будет когда в дочерних элементах будет использован android:layout_span больше единицы.

Иначе говоря этот метод возвращает "ребенка" не по порядковому номеру как getChildAt(), а возвращает View находящееся в данной колонке.

→ Ссылка
Автор решения: Nowhere Man

Метод getChildAt определён в родительском классе ViewGroup, пример реализации:

public View getChildAt(int index) {
    if (index < 0 || index >= mChildrenCount) {
        return null;
    }
    return mChildren[index];
}

Доступ в TableRow::getVirtualChildAt строится через промежуточный массив индексов mColumnToChildIndex, в котором колонки отображаются на дочерние элементы, то есть, сначала лениво вычисляется индекс, а затем вызывается родительский метод getChildAt:

public View getVirtualChildAt(int i) {
    if (mColumnToChildIndex == null) {
       mapIndexAndColumns();
    }
    final int deflectedIndex = mColumnToChildIndex.get(i, -1);
    if (deflectedIndex != -1) {
        return getChildAt(deflectedIndex);
    }
    return null;
}
→ Ссылка