Scrollview中嵌套recyclerview时,如何获得recyclerview的总高度?

Scrollview中嵌套recyclerview时,如何获得recyclerview的总高度?不然外层的scrollview没什么用

7个回答

你获得是计算的实际高度还是有问题的高度,我们知道,scrollview嵌套listview、gridview之类的有问题,所以如果你需要计算recycleview的高度,就需要知道
item的个数与item的高度,然后计算得出

qq787068730
大虫子猪NO1 回复yyy000112: 只有真正接触了这块的人才知道,通过计算每个item的高度乘以item的个数,这样是不准确的。最好的办法请看我的答案
2 年多之前 回复
yyy000112
yyy000112 计算item高度时用layoutManager.getHeight();获取出来的高度为什么有时候很不准确
接近 3 年之前 回复

试着重写RecyclerView的onMeasure方法试试,

 class MyRecyclerView extends RecyclerView {
    public MyRecyclerView(Context context) {
        super(context);
    }

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

    public MyRecyclerView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

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

        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}

我个人意见,相对于嵌套来说,如果是listview的话不如用添加header和footer用起来方便,recyclerview的话也可以添加header,只不过不像listview有原生方法那么方便,另外也可以考虑运用多布局来完成,也很方便。。。

yyy000112
yyy000112 添加头布局不行,我这一个页面里可以切换几个子页面
接近 3 年之前 回复

RecyclerView或者ListView等在页面加载后除非外部条件发生改变重新设置其高度,否则他们的高度将一直和加载的时候一致,其实现机理并不是
为每个item都设定一个新的ViewItem,而是根据其界面上可能用到的item个数,初始化对应个数的itemView,然后之后当滚动的时候,只是把数
据条目按照滚动方向移动并显示到与之对应的item上。这样就可以在使用最少的View的情况下显示最多的数据。既能节约内存,又能提高响应速度。

所以从上可以看出,List这一类的控件,是在有限的空间上,按需供应内容。好比商铺,他只有一个窗口给你,你也只能看到一个窗口。只有你想看的东西才会摆到窗口上,暂时不想看的都放到了后院的仓库里。

而ScrollView则是所有View全加载的。所以在ScrollView不适合显示List一类的东西。因为这会非常耗内存。

从上可以看出,如果ScrollView内套入ListView后,ListView的大小除非外部强制改变其大小,否则不会改变,也就是说ListView的高度不会因为其内部View发生改变而发出请求让ListView调整大小。ListView只会说地盘就这么大了,显示不下的内容,就不要显示了。

而ScrollView等其它大部分View在设置恰当的参数的时候,如果自己内部要显示的内容需求更多空间的时候就会主动对parent请求,parent就会重新要求其下的所有View各自看看需要多大地盘,然后parent在根据一定的策略进行设定。

所以ScrollView中嵌套ListView火RecycleView后,指望它里面的内容增加了就主动对ScrollView请求地盘是不行的。

如果要部分固定内容可以跟着List条目一起滚动,那么可以根据情况考虑加header或者footer

建议监听RecyclerView的addOnScrollListener后自己记录onScrolled的dy,
同时给adapter加个registerAdapterDataObserver,
监听插入/删除/移动,自己加减前面记录的dy滚动值。

具体思路就是获得每个item的高度,最后是根据获得item的数量乘以高度,等于把高度写死。至于获得item的高度是在setAdapter之后,用layoutManager.getHeight();获取,但这个方法有时候能获得准确的高度,有时候获取不到准确的,这个问题有待高人解答。

小伙子,你是不是要做RecyclerView铺满屏幕呀?
获得到手机屏幕高度,再减去其他控件高度。剩下的就是RecyclerView的高度啦。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!