Android Open Source - ixming-android-inject Wrapped View Finder






From Project

Back to project page ixming-android-inject.

License

The source code is released under:

Apache License

If you think the Android project ixming-android-inject listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package org.ixming.android.inject.core;
//from  ww  w.  jav a  2s.  c o m
import android.util.SparseArray;
import android.view.View;

class WrappedViewFinder {

  // ??????View?????
  private IViewFinder mViewFinder;
  
  private final int NONE_PARENT_KEY = 0;
  // ??cache????????????????????????????
  private SparseArray<View> mParentViewCache;
  private SparseArray<SparseArray<View>> mChildViewCache;
  public WrappedViewFinder(IViewFinder viewFinder) {
    mViewFinder = viewFinder;
  }
  
  public View findViewById(int id, int parentId) {
    View view;
      if (parentId > 0) {
        // get parent view from cache first
        // then get View from cache
        view = findViewByParentId0(id, parentId);
      } else {
        view = findViewByParentId0(id, NONE_PARENT_KEY);
      }
      return view;
  }
  
  private View findParentViewById(int parentId) {
    View parentView = null;
    if (null != mParentViewCache) {
      parentView = mParentViewCache.get(parentId);
    }
    if (null != parentView) {
      return parentView;
    }
    parentView = findViewByParentId0(parentId, NONE_PARENT_KEY);
    if (null == parentView) {
      // ????parentId???View
      throw new NullPointerException("cannot find a view by (parentId = 0x"
          + Integer.toHexString(parentId) + ")");
    }
    if (null == mParentViewCache) {
      mParentViewCache = new SparseArray<View>();
    }
    mParentViewCache.put(parentId, parentView);
    return parentView;
  }
  
  private View findViewByParentId0(int id, int parentId) {
    // ??View???????
    View targetView = null;
    SparseArray<View> childViewCacheOfParent = null;
    if (null != mChildViewCache) {
      childViewCacheOfParent = mChildViewCache.get(parentId);
      if (null != childViewCacheOfParent) {
        targetView = childViewCacheOfParent.get(id);
      }
    }
    if (null != targetView) {
      return targetView;
    }
    if (parentId == NONE_PARENT_KEY) {
      // ????IViewFinder????
      targetView = mViewFinder.findViewById(id);
      if (null == targetView) {
        // ????parentId???View
        throw new NullPointerException("cannot find a view by (id = 0x"
            + Integer.toHexString(id) + ")");
      }
    } else {
      // ????????target view
      // ?????parent view
      View parentView = findParentViewById(parentId);
      // ?parent view??target view
      targetView = parentView.findViewById(id);
      if (null == targetView) {
        // ????parentId???View
        throw new NullPointerException("cannot find a view by (id = 0x"
            + Integer.toHexString(id) + ") "
            + "from parent (parentId = "
            + Integer.toHexString(parentId) + ")");
      }
    }
    // ????????
    if (null == mChildViewCache) {
      mChildViewCache = new SparseArray<SparseArray<View>>();
    }
    if (null == childViewCacheOfParent) {
      childViewCacheOfParent = new SparseArray<View>();
      mChildViewCache.put(parentId, childViewCacheOfParent);
    }
    childViewCacheOfParent.put(id, targetView);
    return targetView;
  }
  
  @Override
  protected void finalize() throws Throwable {
    if (null != mParentViewCache) {
      mParentViewCache.clear();
      mParentViewCache = null;
    }
    if (null != mChildViewCache) {
      for (int i = 0; i < mChildViewCache.size(); i++) {
        SparseArray<View> sp = mChildViewCache.get(mChildViewCache.keyAt(i));
        if (null != sp) {
          sp.clear();
        }
      }
      mChildViewCache.clear();
      mChildViewCache = null;
    }
  }
  
}




Java Source Code List

org.ixming.android.MainActivity.java
org.ixming.android.inject.InjectConfigure.java
org.ixming.android.inject.InjectorUtils.java
org.ixming.android.inject.ResTargetType.java
org.ixming.android.inject.annotation.OnClickMethodInject.java
org.ixming.android.inject.annotation.ResInject.java
org.ixming.android.inject.annotation.ViewInject.java
org.ixming.android.inject.annotation.ViewOnClickInject.java
org.ixming.android.inject.annotation.package-info.java
org.ixming.android.inject.core.ActivityInjectLoader.java
org.ixming.android.inject.core.BaseInjectLoader.java
org.ixming.android.inject.core.IOnClickListenerInjector.java
org.ixming.android.inject.core.IResInjector.java
org.ixming.android.inject.core.IViewFinder.java
org.ixming.android.inject.core.IViewInjector.java
org.ixming.android.inject.core.InjectLoaderFactory.java
org.ixming.android.inject.core.ResLoader.java
org.ixming.android.inject.core.ViewInjectLoader.java
org.ixming.android.inject.core.WrappedViewFinder.java
org.ixming.android.inject.themed.ThemedInjectConfigure.java
org.ixming.android.inject.themed.ThemedInjectorUtils.java
org.ixming.android.inject.themed.ThemedResInject.java
org.ixming.android.inject.themed.package-info.java
org.ixming.android.inject.package-info.java