summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Adam Cohen <adamcohen@google.com> 2012-12-06 23:22:37 -0800
committer Android Git Automerger <android-git-automerger@android.com> 2012-12-06 23:22:37 -0800
commit2f536b18c447ad0000afcd578aa3985b8e1557bc (patch)
tree829bbdd1d1f610e863397ede100ddf7c59bf7de1
parent903901af972a4b484b4172baaec98060fbbc8c6f (diff)
parentb93762809beb13f61c6b2f7cb908a4ce81f46c82 (diff)
am b9376280: am 224d2225: am 29cfce7a: Merge "Making sure to clear state related to views that are being recycled (issue 7650538)" into jb-mr1.1-dev
* commit 'b93762809beb13f61c6b2f7cb908a4ce81f46c82': Making sure to clear state related to views that are being recycled (issue 7650538)
-rw-r--r--core/java/android/widget/RemoteViewsAdapter.java24
1 files changed, 23 insertions, 1 deletions
diff --git a/core/java/android/widget/RemoteViewsAdapter.java b/core/java/android/widget/RemoteViewsAdapter.java
index b088c59a084a..aeee1115429a 100644
--- a/core/java/android/widget/RemoteViewsAdapter.java
+++ b/core/java/android/widget/RemoteViewsAdapter.java
@@ -318,9 +318,13 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback
*/
private class RemoteViewsFrameLayoutRefSet {
private HashMap<Integer, LinkedList<RemoteViewsFrameLayout>> mReferences;
+ private HashMap<RemoteViewsFrameLayout, LinkedList<RemoteViewsFrameLayout>>
+ mViewToLinkedList;
public RemoteViewsFrameLayoutRefSet() {
mReferences = new HashMap<Integer, LinkedList<RemoteViewsFrameLayout>>();
+ mViewToLinkedList =
+ new HashMap<RemoteViewsFrameLayout, LinkedList<RemoteViewsFrameLayout>>();
}
/**
@@ -337,6 +341,7 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback
refs = new LinkedList<RemoteViewsFrameLayout>();
mReferences.put(pos, refs);
}
+ mViewToLinkedList.put(layout, refs);
// Add the references to the list
refs.add(layout);
@@ -355,21 +360,34 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback
final LinkedList<RemoteViewsFrameLayout> refs = mReferences.get(pos);
for (final RemoteViewsFrameLayout ref : refs) {
ref.onRemoteViewsLoaded(view, mRemoteViewsOnClickHandler);
+ if (mViewToLinkedList.containsKey(ref)) {
+ mViewToLinkedList.remove(ref);
+ }
}
refs.clear();
-
// Remove this set from the original mapping
mReferences.remove(pos);
}
}
/**
+ * We need to remove views from this set if they have been recycled by the AdapterView.
+ */
+ public void removeView(RemoteViewsFrameLayout rvfl) {
+ if (mViewToLinkedList.containsKey(rvfl)) {
+ mViewToLinkedList.get(rvfl).remove(rvfl);
+ mViewToLinkedList.remove(rvfl);
+ }
+ }
+
+ /**
* Removes all references to all RemoteViewsFrameLayouts returned by the adapter.
*/
public void clear() {
// We currently just clear the references, and leave all the previous layouts returned
// in their default state of the loading view.
mReferences.clear();
+ mViewToLinkedList.clear();
}
}
@@ -1134,6 +1152,10 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback
boolean isConnected = mServiceConnection.isConnected();
boolean hasNewItems = false;
+ if (convertView != null && convertView instanceof RemoteViewsFrameLayout) {
+ mRequestedViews.removeView((RemoteViewsFrameLayout) convertView);
+ }
+
if (!isInCache && !isConnected) {
// Requesting bind service will trigger a super.notifyDataSetChanged(), which will
// in turn trigger another request to getView()