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:
@ -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()
|
||||||
|
Reference in New Issue
Block a user