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