android错误笔记----嵌套listview显示只有一行

本文详细解析了在ScrollView中嵌套ListView时只显示一行的问题原因,并提供了两种解决方案:一是重写ListView的onMeasure方法来调整高度;二是通过计算ListView中各子项的高度总和来动态设置ListView的高度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是个很老的问题了,今天有人问了下告诉别人了,但是解释的不是很清晰,这里我就在写下,只做自己回忆用的(( ⊙ o ⊙ )!)
一、问题的原因
由于嵌套后计算listview的高度出现问题导致的。比如在ScrollView中嵌套ListView空间,无法正确的计算ListView的大小,所以你们就只看到一行。

二、解决方法
1.重写listview的计算高度的方法(onMeasure)

   @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }

这里说明下
/设置为Integer.MAX_VALUE>>2 是listview全部展开
//也可以设置为高度这里是设置listview的高度 不全部展开 实现可以滑动的效果
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
1.精确模式(MeasureSpec.EXACTLY)
2.最大模式(MeasureSpec.AT_MOST)

2.就是获取当前的listview的适配器,然后计算高度

    public void setListViewHeightBasedOnChildren(ListView listView) {   
        // 获取ListView对应的Adapter,如果没有就返回   
        ListAdapter listAdapter = listView.getAdapter();   
        if (listAdapter == null) {   
            return;   
        }   

        int totalHeight = 0;   
        for (int i = 0, len = listAdapter.getCount(); i < len; i++) {   
            // listAdapter.getCount()返回数据项的数目
    //这里你也可以设置自己想要的显示条数,当然要实现滚动
    //你还要做些其他的设置   
            View listItem = listAdapter.getView(i, null, listView);   
            // 计算子项View 的宽高   
            listItem.measure(0, 0);    
            // 统计所有子项的总高度   
            totalHeight += listItem.getMeasuredHeight();    
        }   

        ViewGroup.LayoutParams params = listView.getLayoutParams();   
        params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));   
        // listView.getDividerHeight()获取子项间分隔符占用的高度   
        // params.height最后得到整个ListView完整显示需要的高度   
        listView.setLayoutParams(params);   
    } 

最后我们说下recyclevew,recycleview的功能就很强大了,
它能自己处理一些焦点的问题,很多情况下都不用处理焦点了。
(而且最主要的是用recycleview写嵌套滑动布局很舒服)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值