Merge "Invalidate child bounds when AbsListView bounds change" into nyc-dev

This commit is contained in:
Yigit Boyar
2016-05-31 19:20:19 +00:00
committed by Android (Google) Code Review

View File

@@ -2675,18 +2675,48 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
return (mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK ? 0 : mPaddingBottom;
}
/**
* @hide
*/
@Override
protected void internalSetPadding(int left, int top, int right, int bottom) {
super.internalSetPadding(left, top, right, bottom);
if (isLayoutRequested()) {
handleBoundsChange();
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
if (getChildCount() > 0) {
mDataChanged = true;
rememberSyncState();
}
handleBoundsChange();
if (mFastScroll != null) {
mFastScroll.onSizeChanged(w, h, oldw, oldh);
}
}
/**
* Called when bounds of the AbsListView are changed. AbsListView marks data set as changed
* and force layouts all children that don't have exact measure specs.
* <p>
* This invalidation is necessary, otherwise, AbsListView may think the children are valid and
* fail to relayout them properly to accommodate for new bounds.
*/
void handleBoundsChange() {
final int childCount = getChildCount();
if (childCount > 0) {
mDataChanged = true;
rememberSyncState();
for (int i = 0; i < childCount; i++) {
final View child = getChildAt(i);
final ViewGroup.LayoutParams lp = child.getLayoutParams();
// force layout child unless it has exact specs
if (lp == null || lp.width < 1 || lp.height < 1) {
child.forceLayout();
}
}
}
}
/**
* @return True if the current touch mode requires that we draw the selector in the pressed
* state.