From 8bbae343d22fcf12a8f7da2876e880878d53e44a Mon Sep 17 00:00:00 2001 From: Alan Viverette Date: Thu, 25 Jun 2015 14:49:29 -0700 Subject: Ensure partially-detached AbsListView children are removed Bug: 22052083 Change-Id: If8c30c622206257587441bbd4f02c83eb3a62b60 --- core/java/android/widget/AbsListView.java | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index a96bf71d91ef..8bf6992384c4 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 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 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 implements Te // If the adapter has stable IDs, we can reuse the view for // the same data. if (mTransientStateViewsById == null) { - mTransientStateViewsById = new LongSparseArray(); + 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(); + 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(); - } - mSkippedScrap.add(scrap); + getSkippedScrap().add(scrap); } } else { if (mViewTypeCount == 1) { @@ -6663,6 +6664,13 @@ public abstract class AbsListView extends AdapterView implements Te } } + private ArrayList getSkippedScrap() { + if (mSkippedScrap == null) { + mSkippedScrap = new ArrayList<>(); + } + return mSkippedScrap; + } + /** * Finish the removal of any views that skipped the scrap heap. */ -- cgit v1.2.3-59-g8ed1b