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

这篇文章说一个已经老掉牙的问题,但也算比较常见。
写一个布局的时候,难免会遇到界面中的控件已经超出了手机屏幕可显示的范围,这时候就需要在布局中放置一个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冲突问题。

阅读更多
换一批

没有更多推荐了,返回首页