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 class RemoteViewsFrameLayoutRefSet {
private HashMap<Integer, LinkedList<RemoteViewsFrameLayout>> mReferences; private HashMap<Integer, LinkedList<RemoteViewsFrameLayout>> mReferences;
private HashMap<RemoteViewsFrameLayout, LinkedList<RemoteViewsFrameLayout>>
mViewToLinkedList;
public RemoteViewsFrameLayoutRefSet() { public RemoteViewsFrameLayoutRefSet() {
mReferences = new HashMap<Integer, LinkedList<RemoteViewsFrameLayout>>(); 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>(); refs = new LinkedList<RemoteViewsFrameLayout>();
mReferences.put(pos, refs); mReferences.put(pos, refs);
} }
mViewToLinkedList.put(layout, refs);
// Add the references to the list // Add the references to the list
refs.add(layout); refs.add(layout);
@ -355,14 +360,26 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback
final LinkedList<RemoteViewsFrameLayout> refs = mReferences.get(pos); final LinkedList<RemoteViewsFrameLayout> refs = mReferences.get(pos);
for (final RemoteViewsFrameLayout ref : refs) { for (final RemoteViewsFrameLayout ref : refs) {
ref.onRemoteViewsLoaded(view, mRemoteViewsOnClickHandler); ref.onRemoteViewsLoaded(view, mRemoteViewsOnClickHandler);
if (mViewToLinkedList.containsKey(ref)) {
mViewToLinkedList.remove(ref);
}
} }
refs.clear(); refs.clear();
// Remove this set from the original mapping // Remove this set from the original mapping
mReferences.remove(pos); 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. * 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 // We currently just clear the references, and leave all the previous layouts returned
// in their default state of the loading view. // in their default state of the loading view.
mReferences.clear(); mReferences.clear();
mViewToLinkedList.clear();
} }
} }
@ -1134,6 +1152,10 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback
boolean isConnected = mServiceConnection.isConnected(); boolean isConnected = mServiceConnection.isConnected();
boolean hasNewItems = false; boolean hasNewItems = false;
if (convertView != null && convertView instanceof RemoteViewsFrameLayout) {
mRequestedViews.removeView((RemoteViewsFrameLayout) convertView);
}
if (!isInCache && !isConnected) { if (!isInCache && !isConnected) {
// Requesting bind service will trigger a super.notifyDataSetChanged(), which will // Requesting bind service will trigger a super.notifyDataSetChanged(), which will
// in turn trigger another request to getView() // in turn trigger another request to getView()