动态设置ListView高度,解决跟ScrollView嵌套冲突

来源:互联网 发布:若蓝格杂志 知日 编辑:程序博客网 时间:2024/06/06 01:09

这篇文章说一个已经老掉牙的问题,但也算比较常见。
写一个布局的时候,难免会遇到界面中的控件已经超出了手机屏幕可显示的范围,这时候就需要在布局中放置一个ScrollView,使屏幕可以滚动。
当ScrollView中有ListView需要显示的时候,如果ListView是固定高度的,则可以显示正常;但如果ListView里面的数据是不定的,而ListView的高度也是随之变化的,嵌套在ScrollView中的ListView计算不出来高度,这是就会出现显示问题。
常见的现象就是:ListView只显示一行数据。
解决这个问题,就需要根据ListView中item的个数,通过代码动态设置ListView的高度。
动态设置高度对item布局有一个要求:item最外层布局需要是LinearLayout


具体该怎么写,附上一段代码,一看就懂

    private void initView() {        attachmentListView = (ListView) findViewById(R.id.attachmentList);        if (attachmentList.size() > 0) {            attachmentListView.setVisibility(View.VISIBLE);            attachmentAdapter = new OAAttachmentAdapter(this, attachmentList);            attachmentListView.setAdapter(attachmentAdapter);            setListViewHeightByItem(attachmentListView);        }    }
    private void setListViewHeightByItem(ListView listView) {        if (listView == null) {            return;        }        ListAdapter listAdapter = listView.getAdapter();        if (listAdapter == null) {            return;        }        int totalHeight = 0;        for (int i = 0; i < listAdapter.getCount(); i++) {            View item = listAdapter.getView(i, null, listView);            //item的布局要求是linearLayout,否则measure(0,0)会报错。            item.measure(0, 0);            //计算出所有item高度的总和            totalHeight += item.getMeasuredHeight();        }        //获取ListView的LayoutParams,只需要修改高度就可以。        ViewGroup.LayoutParams params = listView.getLayoutParams();        //修改ListView高度为item总高度和所有分割线的高度总和。        //这里的分隔线是指ListView自带的divider        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));        //将修改过的参数,重新设置给ListView        listView.setLayoutParams(params);    }

这样就可以通过item的个数动态设置ListView的高度了,从而解决了与ScrollView冲突问题。

阅读全文
0 0
原创粉丝点击