Ensure partially-detached AbsListView children are removed
Bug: 22052083 Change-Id: If8c30c622206257587441bbd4f02c83eb3a62b60
This commit is contained in:
@ -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.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user