Merge "Invalidate child bounds when AbsListView bounds change" into nyc-dev am: bb039d2f17
am: 1968ffe284
* commit '1968ffe2845b5a98ff9f3bc9bf549d9db981e5ad':
Invalidate child bounds when AbsListView bounds change
Change-Id: I77dccc2452243bba6461e5adc80e703b1b1755b4
This commit is contained in:
@@ -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;
|
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
|
@Override
|
||||||
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
|
||||||
if (getChildCount() > 0) {
|
handleBoundsChange();
|
||||||
mDataChanged = true;
|
|
||||||
rememberSyncState();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mFastScroll != null) {
|
if (mFastScroll != null) {
|
||||||
mFastScroll.onSizeChanged(w, h, oldw, oldh);
|
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
|
* @return True if the current touch mode requires that we draw the selector in the pressed
|
||||||
* state.
|
* state.
|
||||||
|
|||||||
Reference in New Issue
Block a user