我们在用PopupWindow模拟PopupMenu的时候,经常想要ListView能自适应宽度,而如果在XML里设置ListView的属性为wrap_content并不能解决问题,所以我们需要做的只有重写ListView的onMeasure()方法,like this:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int maxWidth = meathureWidthByChilds() + getPaddingLeft() + getPaddingRight();
super.onMeasure(MeasureSpec.makeMeasureSpec(maxWidth,MeasureSpec.UNSPECIFIED),heightMeasureSpec);//注意,这个地方一定是MeasureSpec.UNSPECIFIED
}
public int meathureWidthByChilds() {
int maxWidth = 0;
View view = null;
for (int i = 0; i < getAdapter().getCount(); i++) {
view = getAdapter().getView(i, view, this);
view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
if (view.getMeasuredWidth() > maxWidth){
maxWidth = view.getMeasuredWidth();
}
view = null;
}
return maxWidth;
}
OK,现在大功告成!