前提:自定义从底部弹出的弹出,布局很简单,模仿IOS效果的底部弹窗,我是extend PopupWindow来处理的,关键布局就是LinearLayout包裹了Listview,最初的解决方案是在初始化布局的时候获得屏幕的高度和LinearLayout的高度
int windowHalfHeight = ((Activity) mContext).getWindowManager().getDefaultDisplay().getHeight() / 2;
mLayoutList.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
float mLayerWidth = (float) mLayoutList.getHeight();
if (mLayerWidth != 0 && mLayerWidth >= windowHalfHeight) {
ViewGroup.LayoutParams layoutParams = mLayoutList.getLayoutParams();
layoutParams.height = windowHalfHeight;
mLayoutList.setLayoutParams(layoutParams);
mLayoutList.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
}
});
导致:这样其实只是解决了初始化时候的高度,如果第一次list的数据比较少,数据更新之后重新设置,数据变多,控件还是会被扩展,导致大于半个屏幕的高度。
解决:其实解决方案也很简单,在adapter设置数据的时候重新设置外布局LinearLayout的高度(注意 :xml布局中设置的高度为wrap_content)。
之前一直用OnGlobalLayoutListener监听布局的变化,但是重新设置数据之后监听的高度一直没变化,换思路之后就解决这个bug了。如有知道具体原因的望告知,谢谢。
mData.clear();
mData.addAll(data);
myAdapter.notifyDataSetChanged();
/**数据超过半屏幕设置半个屏幕高度,低于半屏设置具体高度*/
int setHight = windowHalfHeight;
View view = myAdapter.getView(0, null, mListView);
if (null != view) {
view.measure(0, 0);
int allHight = view.getMeasuredHeight() * mData.size();
if (allHight < windowHalfHeight) {
setHight = allHight;
}
ViewGroup.LayoutParams layoutParams = mLayoutList.getLayoutParams();
layoutParams.height = setHight;
mLayoutList.setLayoutParams(layoutParams);
}