summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Viverette <alanv@google.com>2015-06-25 14:49:29 -0700
committerAlan Viverette <alanv@google.com>2015-06-25 14:49:29 -0700
commit8bbae343d22fcf12a8f7da2876e880878d53e44a (patch)
tree7ce9c942cd0a6220a1478207577127e23879a2ed
parente71c6e3832a963ed3cfa8c124374799f774eccb3 (diff)
downloadframeworks_base-8bbae343d22fcf12a8f7da2876e880878d53e44a.zip
frameworks_base-8bbae343d22fcf12a8f7da2876e880878d53e44a.tar.gz
frameworks_base-8bbae343d22fcf12a8f7da2876e880878d53e44a.tar.bz2
Ensure partially-detached AbsListView children are removed
Bug: 22052083 Change-Id: If8c30c622206257587441bbd4f02c83eb3a62b60
-rw-r--r--core/java/android/widget/AbsListView.java20
1 files changed, 14 insertions, 6 deletions
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index a96bf71..8bf6992 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -6605,6 +6605,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
void addScrapView(View scrap, int position) {
final AbsListView.LayoutParams lp = (AbsListView.LayoutParams) scrap.getLayoutParams();
if (lp == null) {
+ // Can't recycle, skip the scrap heap.
+ getSkippedScrap().add(scrap);
return;
}
@@ -6614,6 +6616,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
// should otherwise not be recycled.
final int viewType = lp.viewType;
if (!shouldRecycleViewType(viewType)) {
+ // Can't recycle, skip the scrap heap.
+ getSkippedScrap().add(scrap);
return;
}
@@ -6633,22 +6637,19 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
// If the adapter has stable IDs, we can reuse the view for
// the same data.
if (mTransientStateViewsById == null) {
- mTransientStateViewsById = new LongSparseArray<View>();
+ mTransientStateViewsById = new LongSparseArray<>();
}
mTransientStateViewsById.put(lp.itemId, scrap);
} else if (!mDataChanged) {
// If the data hasn't changed, we can reuse the views at
// their old positions.
if (mTransientStateViews == null) {
- mTransientStateViews = new SparseArray<View>();
+ mTransientStateViews = new SparseArray<>();
}
mTransientStateViews.put(position, scrap);
} else {
// Otherwise, we'll have to remove the view and start over.
- if (mSkippedScrap == null) {
- mSkippedScrap = new ArrayList<View>();
- }
- mSkippedScrap.add(scrap);
+ getSkippedScrap().add(scrap);
}
} else {
if (mViewTypeCount == 1) {
@@ -6663,6 +6664,13 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
}
}
+ private ArrayList<View> getSkippedScrap() {
+ if (mSkippedScrap == null) {
+ mSkippedScrap = new ArrayList<>();
+ }
+ return mSkippedScrap;
+ }
+
/**
* Finish the removal of any views that skipped the scrap heap.
*/