Merge "Plug memory leak in Simple*Adapter, due to the misuse of a WeakHashMap. This removes an optimization but the benefit is not worth the memory leak. Bug: #2353474."
diff --git a/core/java/android/widget/SimpleAdapter.java b/core/java/android/widget/SimpleAdapter.java
index 9dd4d15..479965a 100644
--- a/core/java/android/widget/SimpleAdapter.java
+++ b/core/java/android/widget/SimpleAdapter.java
@@ -25,7 +25,6 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.WeakHashMap;
 
 /**
  * An easy adapter to map static data to views defined in an XML file. You can specify the data
@@ -58,7 +57,6 @@
     private int mResource;
     private int mDropDownResource;
     private LayoutInflater mInflater;
-    private final WeakHashMap<View, View[]> mHolders = new WeakHashMap<View, View[]>();
 
     private SimpleFilter mFilter;
     private ArrayList<Map<String, ?>> mUnfilteredData;
@@ -121,16 +119,6 @@
         View v;
         if (convertView == null) {
             v = mInflater.inflate(resource, parent, false);
-
-            final int[] to = mTo;
-            final int count = to.length;
-            final View[] holder = new View[count];
-
-            for (int i = 0; i < count; i++) {
-                holder[i] = v.findViewById(to[i]);
-            }
-
-            mHolders.put(v, holder);
         } else {
             v = convertView;
         }
@@ -162,13 +150,12 @@
         }
 
         final ViewBinder binder = mViewBinder;
-        final View[] holder = mHolders.get(view);
         final String[] from = mFrom;
         final int[] to = mTo;
         final int count = to.length;
 
         for (int i = 0; i < count; i++) {
-            final View v = holder[i];
+            final View v = view.findViewById(to[i]);
             if (v != null) {
                 final Object data = dataSet.get(from[i]);
                 String text = data == null ? "" : data.toString();
@@ -187,7 +174,8 @@
                             ((Checkable) v).setChecked((Boolean) data);
                         } else {
                             throw new IllegalStateException(v.getClass().getName() +
-                                    " should be bound to a Boolean, not a " + data.getClass());
+                                    " should be bound to a Boolean, not a " +
+                                    (data == null ? "<unknown type>" : data.getClass()));
                         }
                     } else if (v instanceof TextView) {
                         // Note: keep the instanceof TextView check at the bottom of these
diff --git a/core/java/android/widget/SimpleCursorAdapter.java b/core/java/android/widget/SimpleCursorAdapter.java
index 436b79b..7d3459e 100644
--- a/core/java/android/widget/SimpleCursorAdapter.java
+++ b/core/java/android/widget/SimpleCursorAdapter.java
@@ -20,9 +20,6 @@
 import android.database.Cursor;
 import android.net.Uri;
 import android.view.View;
-import android.view.ViewGroup;
-
-import java.util.WeakHashMap;
 
 /**
  * An easy adapter to map columns from a cursor to TextViews or ImageViews
@@ -66,7 +63,6 @@
     private CursorToStringConverter mCursorToStringConverter;
     private ViewBinder mViewBinder;
     private String[] mOriginalFrom;
-    private final WeakHashMap<View, View[]> mHolders = new WeakHashMap<View, View[]>();
 
     /**
      * Constructor.
@@ -91,29 +87,6 @@
         findColumns(from);
     }
 
-    @Override
-    public View newView(Context context, Cursor cursor, ViewGroup parent) {
-        return generateViewHolder(super.newView(context, cursor, parent));
-    }
-
-    @Override
-    public View newDropDownView(Context context, Cursor cursor, ViewGroup parent) {
-        return generateViewHolder(super.newDropDownView(context, cursor, parent));
-    }
-
-    private View generateViewHolder(View v) {
-        final int[] to = mTo;
-        final int count = to.length;
-        final View[] holder = new View[count];
-
-        for (int i = 0; i < count; i++) {
-            holder[i] = v.findViewById(to[i]);
-        }
-        mHolders.put(v, holder);
-
-        return v;
-    }
-
     /**
      * Binds all of the field names passed into the "to" parameter of the
      * constructor with their corresponding cursor columns as specified in the
@@ -140,13 +113,13 @@
      */
     @Override
     public void bindView(View view, Context context, Cursor cursor) {
-        final View[] holder = mHolders.get(view);
         final ViewBinder binder = mViewBinder;
         final int count = mTo.length;
         final int[] from = mFrom;
+        final int[] to = mTo;
 
         for (int i = 0; i < count; i++) {
-            final View v = holder[i];
+            final View v = view.findViewById(to[i]);
             if (v != null) {
                 boolean bound = false;
                 if (binder != null) {