嵌套ListView&GridView测量其高度的方法

来源:互联网 发布:mac苹果商店 编辑:程序博客网 时间:2024/06/16 18:11

总会遇到在ScrollView中嵌套ListView,或者在ListView中嵌套GrideView等等的情景,在这种情景中,往往嵌套的对应的View的测量就存在一些问题了。针对这种情况,网上可以搜到很多相关的代码。

public static void measureListViewHeight(final AbsListView listView) {    final ListAdapter listAdapter = listView.getAdapter();    if (listAdapter == null) {        return;    }    listView.post(new Runnable() {        @Override        public void run() {            int totalHeight = 0;            int count = listAdapter.getCount();            //TODO 这里可以去获取每一列最高的一个            View listItem = listAdapter.getView(0, null, listView);            listItem.measure(0, 0);            if (listView instanceof GridView) {                int columns = ((GridView) listView).getNumColumns();                int rows = count % columns != 0 ? 1 : 0;                rows += count / columns;                totalHeight += listItem.getMeasuredHeight() * rows;            } else if (listView instanceof ListView) {                for (int i = 0; i < count; i++) {                    listItem = listAdapter.getView(i, null, listView);                    listItem.measure(0, 0);                    totalHeight += listItem.getMeasuredHeight() + ((ListView) listView).getDividerHeight() * (listAdapter.getCount() - 1);                }            }            ViewGroup.LayoutParams params = listView.getLayoutParams();            params.height = totalHeight;            listView.setLayoutParams(params);        }    });}

我想说的是,在机型版本适配的时候,会提示在listItem.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED))的时候会报出 空指针异常!这个也是醉醉的!

解决方案:

measure的方法之前首先进行一下LayoutParams的设置!

 listItem.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT));

上面这个方法是可以对ListView和GridView都可以进行相关的测量的。
但是GrideView一行显示的item高度不统一的情况没有还没有涉及到。

最后,这个方法要在其设置了Adapter之后!

为什么要post???????
因为如果不post一下的话,GridView根本获取不到对应的列数。

0 0
原创粉丝点击