Я просто надам цю відповідь як альтернативний рекурсивний алгоритм @ IHeartAndroid для виявлення всіх дітей View
у ієрархії перегляду. Зауважимо, що на момент написання цього запису рекурсивне рішення є помилковим у тому, що воно буде містити дублікати у своєму результаті.
Для тих, хто має проблеми з обгортанням голови навколо рекурсії, ось нерекурсивна альтернатива. Ви отримуєте бонусні бали, усвідомлюючи це, також є альтернативою пошуку на широті в першу чергу на підході до рекурсивного рішення.
private List<View> getAllChildrenBFS(View v) {
List<View> visited = new ArrayList<View>();
List<View> unvisited = new ArrayList<View>();
unvisited.add(v);
while (!unvisited.isEmpty()) {
View child = unvisited.remove(0);
visited.add(child);
if (!(child instanceof ViewGroup)) continue;
ViewGroup group = (ViewGroup) child;
final int childCount = group.getChildCount();
for (int i=0; i<childCount; i++) unvisited.add(group.getChildAt(i));
}
return visited;
}
Кілька швидких тестів (нічого формального) припускають, що ця альтернатива також є швидшою, хоча це, швидше за все, пов'язане з кількістю нових ArrayList
примірників, які створює інша відповідь. Також результати можуть змінюватися залежно від того, наскільки вертикальною / горизонтальною є ієрархія перегляду.
Перехресне повідомлення від: Android | Отримати всі дитячі елементи ViewGroup