解决底部弹窗高度最高为半个屏幕高度,变动数据出现非半屏的bug

来源:互联网 发布:网络直播服务器搭建 编辑:程序博客网 时间:2024/06/05 08:40

前提:自定义从底部弹出的弹出,布局很简单,模仿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);        }
阅读全文
0 0
原创粉丝点击