diff options
author | Adam Cohen <adamcohen@google.com> | 2012-12-06 11:02:58 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-12-06 11:02:58 -0800 |
commit | 29cfce7a387c5f1ea92a310398ed4ed213a3cf62 (patch) | |
tree | 519837f03581ba721761d860fff4099f87ae309a /core/java/android/widget | |
parent | 683028ca0dab7b5cf7afff4501c2372350231bae (diff) | |
parent | ff067190770281b221398e4ac9992a5e4bb10b27 (diff) | |
download | frameworks_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.java | 24 |
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() |