summaryrefslogtreecommitdiffstats
path: root/core/java/android/widget
diff options
context:
space:
mode:
authorAdam Cohen <adamcohen@google.com>2012-12-06 11:02:58 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-12-06 11:02:58 -0800
commit29cfce7a387c5f1ea92a310398ed4ed213a3cf62 (patch)
tree519837f03581ba721761d860fff4099f87ae309a /core/java/android/widget
parent683028ca0dab7b5cf7afff4501c2372350231bae (diff)
parentff067190770281b221398e4ac9992a5e4bb10b27 (diff)
downloadframeworks_base-29cfce7a387c5f1ea92a310398ed4ed213a3cf62.zip
frameworks_base-29cfce7a387c5f1ea92a310398ed4ed213a3cf62.tar.gz
frameworks_base-29cfce7a387c5f1ea92a310398ed4ed213a3cf62.tar.bz2
Merge "Making sure to clear state related to views that are being recycled (issue 7650538)" into jb-mr1.1-dev
Diffstat (limited to 'core/java/android/widget')
-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 b088c59..aeee111 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()