ScrollView与ListView合用(计算Listview的高度)的问题解决

最近项目中碰到ScrollView嵌套ListView,搞了好久,ListView一直显示不全,网上找了好久,最终解决了,在此记录下,避免下次遇到时忘记

最初以为获取下ListView的高度,然后重新设置下ListView高度就可以了,代码如下

public void setLisViewHight(ListView listView) {
        //获取listview的adapter
        ListAdapter mAdapter = (ListAdapter) listView.getAdapter();
        if (mAdapter == null) {
            return ;
        }
        int totalHeight = 0;
        //重复获取listview的子view的高度
        for (int i = 0; i < mAdapter.getCount(); i++) {
            //获取子view
            View mView = mAdapter.getView(i, null, listView);
            //获取子view的高度
            mView.measure(
                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
            //叠加子view的高度,最终计算所有view的高度
            totalHeight += mView.getMeasuredHeight();
        }
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        //最终listview高度是所有子view高度以及所有间隔的高度
        //listView.getDividerHeight() 获取listview一个间隔的高度
        //params.height即listview的高度
        params.height = totalHeight + (listView.getDividerHeight() * (mAdapter.getCount() - 1));
        listView.setLayoutParams(params);
        return ;
    }

但设置完后,发现ListView的高度还是不对,最终在网上搜索发现,只需要自定义一个ListView,重写onMeasure()方法,就可以让ListView自适应高度,如下

public class MyListview extends ListView {

    public MyListview(Context context) {
        super(context);
    }


    public MyListview(Context context, AttributeSet attrs, int defStyleAttr,
                      int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }


    public MyListview(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    public MyListview(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    /**
     * 重写该方法,达到使ListView适应ScrollView的效果
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }

}

你可能感兴趣的:(ScrollView与ListView合用(计算Listview的高度)的问题解决)