Tôi sẽ chỉ cung cấp câu trả lời này như là một thuật toán đệ quy thay thế của @ IHeartAndroid để khám phá tất cả các con View
trong một hệ thống phân cấp xem. Lưu ý rằng tại thời điểm viết bài này, giải pháp đệ quy bị thiếu sót ở chỗ nó sẽ chứa các bản sao trong kết quả của nó.
Đối với những người gặp khó khăn trong việc điều chỉnh đệ quy, đây là một giải pháp thay thế không đệ quy. Bạn nhận được điểm thưởng khi nhận ra đây cũng là một thay thế tìm kiếm đầu tiên theo chiều rộng cho phương pháp tiếp cận theo chiều sâu của giải pháp đệ quy.
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;
}
Một vài thử nghiệm nhanh (không có gì chính thức) cho thấy sự thay thế này cũng nhanh hơn, mặc dù điều đó rất có thể xảy ra với số lượng phiên bản mới ArrayList
mà câu trả lời khác tạo ra. Ngoài ra, kết quả có thể thay đổi dựa trên cách phân cấp chế độ xem dọc / ngang.
Đăng chéo từ: Android | Nhận tất cả các phần tử con của Viewgroup