yyy000112
2016-12-22 07:33
采纳率: 43.8%
浏览 6.6k

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

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

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • Antway_ 2016-12-25 13:46
    已采纳

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

    打赏 评论
  • chengxu_yuan2014 2016-12-22 08:37

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

    打赏 评论
  • 昵称12806 2016-12-22 10:09

    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

    打赏 评论
  • 大虫子猪NO1 2016-12-23 04:01

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

    打赏 评论
  • 小小丶白 2016-12-23 07:42

    试着重写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);
        }
    }
    
    打赏 评论
  • 传说中的神话灬 2016-12-23 08:54

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

    打赏 评论
  • yyy000112 2016-12-29 07:25

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

    打赏 评论

相关推荐 更多相似问题