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 '224d22250862d44cca08498630fcb0e7da68912b':
  Making sure to clear state related to views that are being recycled (issue 7650538)
This commit is contained in:
Adam Cohen
2012-12-06 19:00:16 -08:00
committed by Android Git Automerger

View File

@ -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,14 +360,26 @@ 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.
*/
@ -370,6 +387,7 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback
// 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()