Skip to content

Instantly share code, notes, and snippets.

@JakeWharton
Last active March 16, 2022 02:17
Show Gist options
  • Select an option

  • Save JakeWharton/7189309 to your computer and use it in GitHub Desktop.

Select an option

Save JakeWharton/7189309 to your computer and use it in GitHub Desktop.

Revisions

  1. JakeWharton revised this gist Oct 27, 2013. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion HierarchyTreeChangeListener.java
    Original file line number Diff line number Diff line change
    @@ -7,7 +7,7 @@
    */
    public final class HierarchyTreeChangeListener implements ViewGroup.OnHierarchyChangeListener {
    /**
    * Wrap a regular {@link ViewGroup.OnHierarchyChangeListener hierarchy change listener} with on
    * Wrap a regular {@link ViewGroup.OnHierarchyChangeListener hierarchy change listener} with one
    * that monitors an entire tree of views.
    */
    public static HierarchyTreeChangeListener wrap(ViewGroup.OnHierarchyChangeListener delegate) {
  2. JakeWharton created this gist Oct 27, 2013.
    49 changes: 49 additions & 0 deletions HierarchyTreeChangeListener.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,49 @@
    import android.view.View;
    import android.view.ViewGroup;

    /**
    * A {@link ViewGroup.OnHierarchyChangeListener hierarchy change listener} which recursively
    * monitors an entire tree of views.
    */
    public final class HierarchyTreeChangeListener implements ViewGroup.OnHierarchyChangeListener {
    /**
    * Wrap a regular {@link ViewGroup.OnHierarchyChangeListener hierarchy change listener} with on
    * that monitors an entire tree of views.
    */
    public static HierarchyTreeChangeListener wrap(ViewGroup.OnHierarchyChangeListener delegate) {
    return new HierarchyTreeChangeListener(delegate);
    }

    private final ViewGroup.OnHierarchyChangeListener delegate;

    private HierarchyTreeChangeListener(ViewGroup.OnHierarchyChangeListener delegate) {
    if (delegate == null) {
    throw new NullPointerException("Delegate must not be null.");
    }
    this.delegate = delegate;
    }

    @Override public void onChildViewAdded(View parent, View child) {
    delegate.onChildViewAdded(parent, child);

    if (child instanceof ViewGroup) {
    ViewGroup childGroup = (ViewGroup) child;
    childGroup.setOnHierarchyChangeListener(this);
    for (int i = 0; i < childGroup.getChildCount(); i++) {
    onChildViewAdded(childGroup, childGroup.getChildAt(i));
    }
    }
    }

    @Override public void onChildViewRemoved(View parent, View child) {
    if (child instanceof ViewGroup) {
    ViewGroup childGroup = (ViewGroup) child;
    for (int i = 0; i < childGroup.getChildCount(); i++) {
    onChildViewRemoved(childGroup, childGroup.getChildAt(i));
    }
    childGroup.setOnHierarchyChangeListener(null);
    }

    delegate.onChildViewRemoved(parent, child);
    }
    }