Я просто собираюсь предоставить этот ответ в качестве альтернативного рекурсивного алгоритма @ 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