ScrollView与ListView并用时正确计算Listview的高度

来源:互联网 发布:steam怎么公开数据 编辑:程序博客网 时间:2024/05/29 13:49

首先,ListView不能直接用,要自定义一个,然后重写onMeasure()方法:

public class ExpandableListView extends ListView {    public ExpandableListView(Context context) {        super(context);    }    public ExpandableListView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public ExpandableListView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,                MeasureSpec.AT_MOST);        super.onMeasure(widthMeasureSpec, expandSpec);    }}

第二步:写个计算listView每个Item的方法:

public static void setListViewHeightBasedOnChildren(ListView listView) {        ListAdapter adapter = listView.getAdapter();        if (adapter == null) {            return;        }        int totalHeight = 0;        for (int i = 0, len = adapter.getCount(); i < len; i++) { //listAdapter.getCount()返回数据项的数目            View listItem = adapter.getView(i, null, listView);            listItem.measure(0, 0); //计算子项View 的宽高            totalHeight += listItem.getMeasuredHeight(); //统计所有子项的总高度        }        ViewGroup.LayoutParams params = listView.getLayoutParams();        params.height = totalHeight + (listView.getDividerHeight() * (adapter.getCount() - 1));        //listView.getDividerHeight()获取子项间分隔符占用的高度        //params.height最后得到整个ListView完整显示需要的高度        listView.setLayoutParams(params);    }

第三步:listview添加适配器后设置高度即可:

listView.setAdapter(adapter);  new ListViewUtil().setListViewHeightBasedOnChildren(listView);  


0 0