diff options
author | Alan Viverette <alanv@google.com> | 2015-06-25 14:49:29 -0700 |
---|---|---|
committer | Alan Viverette <alanv@google.com> | 2015-06-25 14:49:29 -0700 |
commit | 8bbae343d22fcf12a8f7da2876e880878d53e44a (patch) | |
tree | 7ce9c942cd0a6220a1478207577127e23879a2ed | |
parent | e71c6e3832a963ed3cfa8c124374799f774eccb3 (diff) | |
download | frameworks_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.java | 20 |
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. */ |