Solo voy a proporcionar esta respuesta como un algoritmo recursivo alternativo de @ IHeartAndroid para descubrir a todos los niños View
en una jerarquía de vistas. Tenga en cuenta que en el momento de escribir este artículo, la solución recursiva es defectuosa ya que contendrá duplicados en su resultado.
Para aquellos que tienen problemas para entender la recursividad, aquí hay una alternativa no recursiva. Obtiene puntos de bonificación por darse cuenta de que esto también es una alternativa de búsqueda de primer orden al enfoque de profundidad de la solución recursiva.
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;
}
Un par de pruebas rápidas (nada formal) sugieren que esta alternativa también es más rápida, aunque es probable que tenga que ver con la cantidad de nuevas ArrayList
instancias que crea la otra respuesta. Además, los resultados pueden variar según la verticalidad / horizontalidad de la jerarquía de vistas.
Publicación cruzada desde: Android | Obtenga todos los elementos secundarios de un ViewGroup